【问题标题】:Rails 3.2 Prevent Object from being Saved using ErrorsRails 3.2 防止使用错误保存对象
【发布时间】:2023-04-03 12:54:01
【问题描述】:

我有一个 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 中?

【问题讨论】:

  • 您不能使用“永久”验证的原因是什么?我认为做你想做的事情是将一些验证逻辑移到模型之外,这不是一个好主意。
  • 我经常被问到这个问题,以支持我写的一个 Gem github.com/schneems/wicked 人们想写一行验证,而不会被调用每次对象被保存,仅在向导的上下文中。希望将此信息添加到文档中。也有可能通过元编程直到运行时才知道我们正在更新什么模型。在添加错误时防止 AR 对象被保存的一个很好的通用方法将非常有帮助,并且与 Rails 以前的行为相匹配。不管为什么,如何做的问题仍然存在。

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


【解决方案1】:

您可以设置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

【讨论】:

    【解决方案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 是否?

    【讨论】:

    • 这不适用于这种特殊情况,我不想更改预期的功能,因为用户可以在我得到对象之前保存错误无论如何都会被清除。不过感谢您的回复。另外,pry 很棒......很高兴你正在使用它:)
    • NP,那时你根本无法做你想做的事。并非没有实际向模型添加验证。您可以通过在模型类中包含一个 mixin 来做到这一点。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多