作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的模型设置如下。一切正常,除了允许空白部分记录,即使所有部分和章节字段都是空白的。
class Book < ActiveRecord::Base
has_many :parts, inverse_of: :book
accepts_nested_attributes_for :parts, reject_if: :all_blank
end
class Part < ActiveRecord::Base
belongs_to :book, inverse_of: :parts
has_many :chapters, inverse_of: :part
accepts_nested_attributes_for :chapters, reject_if: :all_blank
end
class Chapter < ActiveRecord::Base
belongs_to :part, inverse_of: :chapters
end
:all_blank
被替换为
proc { |attributes| attributes.all? { |key, value| key == '_destroy' || value.blank? } }
.所以,我用它代替
:all_blank
并添加一些调试。看起来正在发生的事情是该部分的章节属性正在响应
blank?
与
false
因为它是一个实例化的哈希对象,即使它包含的只是另一个只包含空值的哈希:
chapters_attributes: !ruby/hash:ActionController::Parameters
'0': !ruby/hash:ActionController::Parameters
title: ''
text: ''
accepts_nested_attributes_for :parts, reject_if: proc { |attributes|
attributes.all? do |key, value|
key == '_destroy' || value.blank? ||
(value.is_a?(Hash) && value.all? { |key2, value2| value2.all? { |key3, value3| key3 == '_destroy' || value3.blank? } })
end
}
blank?
为
Hash
但这会导致问题。
class Hash
def blank?
:empty? || all? { |k,v| v.blank? }
end
end
:all_blank
像我期望的那样工作,但它很丑陋而且没有经过很好的测试。
module ActiveRecord::NestedAttributes::ClassMethods
REJECT_ALL_BLANK_PROC = proc { |attributes| attributes.all? { |k, v| k == '_destroy' || v.valueless? } }
end
class Object
alias_method :valueless?, :blank?
end
class Hash
def valueless?
blank? || all? { |k, v| v.valueless? }
end
end
class Hash
def blank?
empty? || all? { |k,v| v.blank? }
end
end
最佳答案
使用时 :all_blank
与 accepts_nested_attributes_for
,它将检查每个单独的属性以查看它是否为空白。
# From the api documentation
REJECT_ALL_BLANK_PROC = proc do |attributes|
attributes.all? { |key, value| key == "_destroy" || value.blank? }
end
false
因为哈希不是空的——它包含关联的每个属性的键。此行为将导致
reject_if: :all_blank
返回
false
因为嵌套关联。
# Add an instance method to application_record.rb / active_record.rb
def all_blank?(attributes)
attributes.all? do |key, value|
key == '_destroy' || value.blank? ||
value.is_a?(Hash) && all_blank?(value)
end
end
# Then modify your model book.rb to call that method
accepts_nested_attributes_for :parts, reject_if: :all_blank?
关于ruby-on-rails - 如何拒绝_if : :all_blank for accepts_nested_attributes_for work when working with doubly nested associations?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19415205/
我是 Rails 的新手,因此非常感谢任何建议。 我有一个带有嵌套属性地址的类条目, /app/models/entry.rb class Entry :destroy accepts_nest
所以我有以下模型 宠物 class Pet :all_blank end 拥有者 class Owner :callable, :dependent => :destroy has_one :
我的模型设置如下。一切正常,除了允许空白部分记录,即使所有部分和章节字段都是空白的。 class Book < ActiveRecord::Base has_many :parts, invers
我是一名优秀的程序员,十分优秀!