轨道验证上下文



我需要有关我的ActiveRecord模型的帮助。我有基于上下文的验证(错误)使用内置上下文选项进行验证:

validates :foo, :on => :bar, :presence => true
model = Model.new
model.foo = nil
model.valid? # => true
model.save # works as expected
model.valid?(:bar) # => false
model.save(:context => :bar) # fails and returns false

但是在accepts_nested_attributes_for :model中使用我的模型并调用parent.save失败(验证被调用并返回 false),有什么建议或解决方案吗?


仍然没有答案?为了解释更多关于我的问题:我有一个名为Form的模型,它有很多Field。用户应在提交时看到验证错误,但无论如何都应保存表单(有错误和没有错误)。有不同类型的Field,每种验证都有全局验证(以确保数据库一致性)和自己特定的用户定义验证(验证用户输入的数据)。所以我的Field看起来像这样:

 # Global validations, to ensure database consistency
 # If this validations fail, the record should not be saved!
 validates_associated :form, :on => :global
 ...
 # Specific user-defined validations
 # If this validations fail, the record should be saved but marked as invalid. (Which is done by a before_save filter btw.)
 def validate
   validations.each do |validation| # Array of `ActiveModel::Validations`, defined by the user and stored in a hash in the database
     validation.new(:on => :specific).validate(self)
   end
 end

在我的控制器中:

 # def create
 # ...
 form.attributes = params[:form]
 form.save!(:global)
 form.save(:specific)

在Rails中使用内置功能是否可能出现类似的事情?顺便说一句,这不是我的实际代码,这非常复杂。但我希望,你们会明白这个想法。

尝试条件验证

class Customer 
  attr_accessor :managing 
  validates_presence_of :first_name
  validates_presence_of :last_name 
  with_options :unless => :managing do |o|
    o.validates_inclusion_of :city, :in=> ["San Diego","Rochester"]
    o.validates_length_of :biography, :minimum => 100 
  end
end
@customer.managing = true
@customer.attributes = params[:customer]
@customer.save

"定义验证时指定多个上下文的能力"在 Rails 4.1 中引入 - 检查验证方法,:on 选项说明

仅适用于 Rails 5+:

您正在寻找

with_options on: :custom_event do
  validates :foo, presence: true
  validates :baz, inclusion: { in: ['b', 'c'] }
end

验证或保存使用

model = YourModel.new
# Either
model.valid?(:custom_event)
# Or
model.save(context: :custom_event)

has_nested_attributes_for :model更改为accepts_nested_attributes_for :models

希望这有帮助。

祝你好运。

相关内容

  • 没有找到相关文章

最新更新