我是rails的新手,所以非常感谢任何建议。
我有一个带有嵌套属性地址的类Entry,
/app/models/entry.rb
class Entry < ActiveRecord::Base
has_many :addresses, :dependent => :destroy
accepts_nested_attributes_for :addresses,
:allow_destroy => true,
:reject_if => :all_blank
end
使用类似这样的地址
/app/models/address.rb
class Address < ActiveRecord::Base
belongs_to :entry
validates :zip, :presence => true
end
我以嵌套的形式
/app/view/entries/_form.html.slim
= 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
这个想法是,在呈现表单时,除了数据库中列出的当前地址之外,“build”还将创建一个空的“地址”。保存更改后,如果创建的新地址仍为空,则会被拒绝,不会保存到数据库中。
但是,address.rb中的验证在保存之前进行验证,因此用户无法继续执行保存操作。我遗漏了什么吗?
答案 0 :(得分:1)
您可能希望尝试显式命名地址模型中的属性,然后在创建新的空属性之前对其进行检查。像这样:
# 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
答案 1 :(得分:0)
尝试将false
作为参数传递给save
以跳过验证。