【问题标题】:Nested Attributes: unwanted validation despite of reject_if : All_blank嵌套属性:尽管有 reject_if ,但不需要验证:All_blank
【发布时间】:2013-03-31 03:38:33
【问题描述】:

我是 Rails 新手,因此非常感谢任何建议。

我有一个带有嵌套属性地址的类条目,

/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

这个想法是,当呈现表单时,“构建”将在数据库中列出的当前地址之外创建一个空的“地址”。保存更改后,如果新创建的地址仍为空,则会被拒绝,不会保存到数据库中。

但是 address.rb 中的验证是在保存之前进行验证,因此用户无法继续进行保存操作。有什么我遗漏的吗?

【问题讨论】:

    标签: ruby-on-rails validation nested-attributes


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      尝试将false 作为参数传递给save 以跳过验证。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多