class Gift < ActiveRecord::Base
has_many :contributions
accepts_nested_attributes_for :contributions, :reject_if => proc { |a| a['amount'].blank? }
贡献有:昵称属性。在:新表单中,它预先填充了用户的真实姓名。用户可能决定将其更改为“Uncle Bob”(或其他)。不幸的是,使用:reject_if,如果贡献中没有指定金额,则:在以下情况下,昵称更改将丢失:在@gift无效的情况下重新加载。发生这种情况是因为嵌套的contrib_attributes被拒绝。我们如何保留:昵称更改并仅在实际保存@gift时处理拒绝?
答案 0 :(得分: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)
这保留:昵称通过失败的验证进行更改,但仍丢弃包含以下内容的嵌套式贡献。
答案 1 :(得分:0)
我认为您正在寻找Contribution模型中的验证,而不是:reject_if子句。
:如果满足条件,reject_if将丢弃整个记录。 贡献模型中的失败验证将阻止相关礼物被保存。但是,@ gift将保留贡献,无论其在失败的保存中的金额值如何,当控制器再次呈现新操作时,允许您的用户有机会纠正它。
解决方案是从accepts_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