2009-10-31 65 views
7
class Gift < ActiveRecord::Base 
    has_many :contributions 
    accepts_nested_attributes_for :contributions, :reject_if => proc { |a| a['amount'].blank? } 

貢獻有一個:暱稱屬性。在新形式中,它是用用戶的真實姓名預先填充的。用戶可能決定將其更改爲「叔叔鮑勃」(或其他)。不幸的是,如果:reject_if,如果在貢獻中沒有指定金額,那麼:在@gift無效的情況下,新的重新加載會導致:暱稱更改丟失。發生這種情況是因爲嵌套的contribution_attributes被拒絕。我們如何保留:暱稱更改並僅在實際保存@gift時處理拒絕?accep_nested_attributes_for&:reject_if。如何防止拒絕,直到父母協會保存?

回答

9
class Gift < ActiveRecord::Base 
    has_many :contributions 
    accepts_nested_attributes_for :contributions, 
    :reject_if => proc { |a| a['amount'].blank? } 
end 

class Contribution < ActiveRecord::Base 
    belongs_to :gift 
    validates_presence_of :nickname, :amount 
end 

...在禮品的形式...

f.text_field :nickname, :value => (params[:gift][:contributions_attributes]['0'][:nickname] rescue @m.full_name) 

這保留:暱稱改變通過校驗失敗,仍然丟棄包含嵌套的貢獻:只有綽號。

0

我想你正在尋找Contribution模型中的驗證,而不是:reject_if子句。

:如果條件滿足,reject_if將丟棄整個記錄。 貢獻模型中的驗證失敗將阻止關聯的禮物被保存。然而@gift會保留這個貢獻,而不管它在保存失敗時的金額值,當控制器再次渲染新的動作的時候,允許你的用戶有機會糾正它。

解決的辦法是從accep_nested_attributes_for語句中刪除:reject_if子句,並在Contributions模型中添加validates_presence_of_amount。

class Gift < ActiveRecord::Base 
    has_many :contributions 
    accepts_nested_attributes_for :contributions 
    ... 
end 

class Contribution < ActiveRecord::Base 
    validates_presence_of :amount 
    ... 
end 
+0

是的,我有validates_presence_of:捐款金額。當@ gift表單提交時:1)空白貢獻字段,它工作。 (禮物丟棄空巢。)2)與:量,它的工作。 (執行驗證。)3)使用:暱稱但不是:金額,它不起作用。這是默認情況,因爲我們希望表單中預填有用戶的全名:暱稱。添加:reject_if => a ['amount']。blank ?,刪除用戶對暱稱所做的任何更改。我們希望保留這些更改。合理? – Gavin 2009-10-31 18:47:00

+0

如果是這種情況,也許你應該修改:reject_if子句{| a | ['amount']。blank? && a ['nickname']。blank?} – EmFi 2009-10-31 20:00:26