2014-01-10 52 views
0

使用Rails 3.1 & Ruby 1.9.2。Rails 3 - reject_if如何使用構建?

我在問題和答案模型之間有has_many關聯。問題模型有這樣一行:

accepts_nested_attributes_for :answers, :reject_if => 
     lambda { |n| n[:content].blank? }, :allow_destroy => true 

我的觀點是有點複雜,我只想說,它返回的問題,每個問題可以有答案0-5的嵌套數組的數組。我確信這部分工作正常。


在我的控制,我運行下面的代碼來創建和保存問題&答案:

def create_questions 
    params[:question].each do |q| 
    new_question = Question.new(q) 

    ... 

    if q[:answers] != nil # this only solves the problem of 
          # a question having 0 answers 
     q[:answers].each do |a| 
     new_question.answers.build(a) 
     end 
    end 

    new_question.save 
    end 
end 

我的問題是,我得到保存的空白內容的答案。我認爲answers.build覆蓋了reject_if,但我不確定。我很清楚,我可以使用一百萬個解決方案來解決這個問題,但傳統和最短(代碼方式)的方式是什麼?

回答

1

accept_nested_attributes_for方法用於直接饋送嵌套模型的字段。我的意思是你只需要在問題散列中包含:answers_attributes。它應該在視圖本身中完成。但我不知道你是如何處理的看法,所以我要與

q[:answers_attributes] = q.delete(:answers) 

更換

if q[:answers] != nil # this only solves the problem of a question having 0 answers 
    q[:answers].each do |a| 
    new_question.answers.build(a) 
    end 
end 

或者,你可以改變:answers:answers_attributes在視圖本身。並從控制器中刪除條件部分。

注意您還需要answers_attributes到型號的attr_accessible

+0

您的最後一行是我的解決方案,謝謝。另外,您在控制器中更改參數散列的建議是富有創意的。我更喜歡處理這個特定的問題,但它可能在未來有用。 – UKatz

0

accepts_nested_attributes_for自動處理參數。

如果您的形式你有

<%= form_for @question do |f| %> 

和裏面你有

<%= f.fields_for :answers do |f| %> 

然後創建問題時創建的答案的邏輯已經存在。檢查字段的名稱應該與question[][answers_attributes][content]相似。

在你的控制器,你只需要做:

new_question = Question.new(q) 

,這將創建嵌套問題對你來說,使用reject_if塊。

如果您手動創建答案,那麼您也有責任拒絕答案。

+0

我首先嚐試了您的建議,但沒有奏效。我的問題是我的問題模型的'attr_accessible'沒有'answers_attributes',就像@Manjo指出的那樣。謝謝! – UKatz