Rails 3.2使用错误防止保存对象

我有一个ActiveRecord对象,我想阻止它被保存,而不需要对模型进行永久validation。 你曾经能够使用errors.add做这样的事情,但它看起来不再适用了。

 user = User.last user.errors.add :name, "name doesn't rhyme with orange" user.valid? # => true user.save # => true 

要么

 user = User.last user.errors.add :base, "my unique error" user.valid? # => true user.save # => true 

如何在不修改模型的情况下阻止用户对象保存在Rails 3.2中?

您可以设置errors ,但在validation方法中执行,例如:

 validate :must_rhyme_with_orange def must_rhyme_with_orange unless rhymes_with_orange? errors.add(:name, "doesn't rhyme with orange") end end 

如果要有条件地运行validation,一个技巧是使用attr_accessor和一个保护条件:

 attr_accessor :needs_rhyming validate :must_rhyme_with_orange, :if => Proc.new {|o| o.needs_rhyming} > u = User.last > u.needs_rhyming = true > u.valid? # false 

您的问题是否有效? 将重新运行validation..重置您的错误。

  pry(main)> u.errors[:base] << "This is some custom error message" => ["This is some custom error message"] pry(main)> u.errors => {:base=>["This is some custom error message"]} pry(main)> u.valid? => true pry(main)> u.errors => {} pry(main)> 

相反,只需检查u.errors.blank?

这与原始问题稍有不同,但我在尝试了几件事后发现了这篇文章。 如果将_destroy属性指定为true,Rails内置了拒绝保存对象的function。 如果您在控制器级别处理模型创建,那将非常有用。