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

时间:2012-03-12 20:56:06

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个ActiveRecord对象,我想阻止它被保存,而不需要对模型进行永久性验证。您以前可以使用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中?

3 个答案:

答案 0 :(得分:7)

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

validate :must_rhyme_with_orange

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

如果您想有条件地运行验证,一个技巧是使用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

答案 1 :(得分:2)

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

     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?

答案 2 :(得分:1)

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