在我的模特中我有
has_one :order, dependent: :destroy
accepts_nested_attributes_for :order, reject_if: lambda { |order| order[:description].blank? }, allow_destroy: true
出于某种原因,尽管reject_if已经过测试并返回true(我使用调试器检查过),但嵌套顺序不会被销毁。
互联网上有很多关于这种现象的文章,但我找不到解决方案。
有人知道如何解决这个问题吗?
答案 0 :(得分:2)
我终于创造了一个聪明的" reject_if"如Destroy on blank nested attribute所述,在这个特定场合设置销毁旗帜,但是,根据我自己的规范,这不是很好的" ruby",所以无法想象没有更好的解决方案...
accepts_nested_attributes_for :order, allow_destroy: true, reject_if: lambda { |attributes|
exists = attributes['id'].present?
empty = attributes[:description].blank?
attributes.merge!({_destroy: 1}) if exists and empty
return (!exists and empty)
}
答案 1 :(得分:1)
来自nested_attributes API
如果无法通过您的条件,您也可以设置:reject_if proc以静默忽略任何新的记录哈希值。
params = { member: {
name: 'joe', order_attributes: [
{ description: 'Kari, the awesome Ruby documentation browser!' },
{ description: 'The egalitarian assumption of the modern citizen' },
{ description: '', _destroy: '1' } # this will be ignored
]
}}
任何具有空白description
的哈希都将被完全忽略,即使它具有_destroy
标志。
如果你想删除带有空白描述的记录,我可以想到两个解决方案
选项1:在您的模型中使用回调删除它们:
before_save :remove_orders_without_description
def remove_orders_without_description
orders.select{|o| o.description.blank?}.each(&:delete)
end
选项2:删除模型定义中的reject_if
选项,并在视图中使用JS来适当设置_delete
属性
答案 2 :(得分:0)
试试这个
accepts_nested_attributes_for :order, reject_if: lambda { |order| order[:_destroy].blank? && order[:description].blank? }, allow_destroy: true