【问题标题】:Rails 3 nested attributes validation not working properlyRails 3嵌套属性验证无法正常工作
【发布时间】:2015-04-09 07:03:17
【问题描述】:

我正在使用 rails 3.2 和 cocoon gem 来创建新的嵌套字段,并拥有这个模型。

ParteDiario.rb

class ParteDiario < ActiveRecord::Base
  has_many :parte_diario_items, dependent: :destroy
  has_many :task_one, through: :parte_diario_items
  accepts_nested_attributes_for :parte_diario_items, :reject_if => lambda { |a| a[:employee_id].blank? and a[:new_employee].blank? }, :allow_destroy => true
  validates_associated :parte_diario_items
end

ParteDiarioItem.rb

class ParteDiarioItem < ActiveRecord::Base
    belongs_to :employee
    belongs_to :task_one, :class_name => 'ParteDiarioTask', :foreign_key => 'task_one_id'
    validates :employee_id, presence: true, if: "new_employee.nil?"
    validates :new_employee, presence: true, if: "employee_id.nil?"
end

ParteDiarioItem 有两列:employee_idnew_employee(这是用于手动插入姓名的字符串)。这个想法是您可以使用现有员工创建一个项目,或者您可以创建一个 new_employee(只需手动编写一个名称)。如果您创建一个新员工,则 empleado_id 为 nil。这样,在数据库中,我将让每个项目都带有一个employee_id 或一个 new_employee_[name]。当其中一个为 nil 时,另一个不应为 nil。

提交表单时,仅发送其中一个字段(当向用户显示employee_id 输入时,不会发送new_employee 输入)。我使用 cocoon gem 创建新的嵌套字段,一切正常(验证除外)。

使用此语法不起作用。提交带有“new_employee input”空白项目的表单时,ParteDiario.valid?是真的。并且应该是假的。

也尝试过类似的方法,结果相同:

validates :employee_id, presence: true, unless: :new_employee
validates :new_employee, presence: true, unless: :employee_id

谁能帮帮我?

非常感谢!

【问题讨论】:

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


    【解决方案1】:

    感谢这个问题,我终于找到了答案: Rails validations are not being run on nested model

    我不知道为什么,但似乎这条线产生了问题

    accepts_nested_attributes_for :parte_diario_items, :reject_if => lambda { |a| a[:employee_id].blank? and a[:new_employee].blank? }, :allow_destroy => true
    

    删除:reject_if... 让我正确验证模型。

    【讨论】:

    • 我花了两个小时试图找出我的表单没有验证的原因,并修复了它。谢谢!
    【解决方案2】:

    以下代码可能对您有所帮助:

    Validates_presence_of :employee_id, :if => Proc.new{|p| p.new_employee.nil? }
    Validates_presence_of :new_employee, :if => Proc.new{ |p| p.employee_id.nil? }
    

    【讨论】:

    • @skunstel 感谢您的回答,但恐怕无法正常工作。发送带有 new_employee 输入空白的表单仍然是有效的 parte_diario。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多