我有一个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中?
答案 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内置了拒绝保存对象的功能。如果您在控制器级别处理模型创建,那将非常有用。