Ruby on rails 嵌套属性:不需要的验证,尽管拒绝\u如果:全部\u为空
我是rails的新手,因此非常感谢您的建议 我有一个带有嵌套属性地址的类条目 /app/models/entry.rbRuby on rails 嵌套属性:不需要的验证,尽管拒绝\u如果:全部\u为空,ruby-on-rails,validation,nested-attributes,Ruby On Rails,Validation,Nested Attributes,我是rails的新手,因此非常感谢您的建议 我有一个带有嵌套属性地址的类条目 /app/models/entry.rb class Entry < ActiveRecord::Base has_many :addresses, :dependent => :destroy accepts_nested_attributes_for :addresses, :allow_destroy => true,
class Entry < ActiveRecord::Base
has_many :addresses, :dependent => :destroy
accepts_nested_attributes_for :addresses,
:allow_destroy => true,
:reject_if => :all_blank
end
其思想是,在呈现表单时,“构建”将在数据库中列出的当前地址之外创建一个空的“地址”。保存更改时,如果创建的新地址仍然为空,则该地址将被拒绝,并且不会保存到数据库中
但是,address.rb中的验证在保存之前进行验证,因此用户无法继续保存操作。有什么我遗漏的吗?尝试将
false
作为参数传递到save
以跳过验证。您可能希望尝试显式命名地址模型中的属性,这些属性在创建新的空属性之前被检查。大概是这样的:
# in app/models/entry.rb
accepts_nested_attributes_for :addresses, reject_if: lambda {|attributes| nested_address_is_empty?(attributes) }
private
def self.nested_address_is_empty?(attrs)
attrs['line_1'].blank? && attrs['line_2'].blank? && attrs['zip'].blank?
end
= simple_form_for(@entry) do |f|
= f.error_notification
- @entry.addresses.build
.form-inputs
= f.simple_fields_for :addresses do |address|
= render 'address_form', :f => address
# in app/models/entry.rb
accepts_nested_attributes_for :addresses, reject_if: lambda {|attributes| nested_address_is_empty?(attributes) }
private
def self.nested_address_is_empty?(attrs)
attrs['line_1'].blank? && attrs['line_2'].blank? && attrs['zip'].blank?
end