在 rails 管理中显示来自 before_save 回调的错误

Display error from before_save callback in rails admin

我正在尝试为可以在 rails_admin 中创建的对象创建回调。我是我的模型,我有以下 before_save 回调。

def check_remaining
  if c.purchased_a == 0
    errors.add(:base, "Some error message here")
  end
end

如果用户创建所述对象时回调中的条件为真,我会尝试在 rails_admin 中显示错误消息。在他们点击保存后,我希望显示错误消息,但实际创建了对象。

由于 C 是该对象所属的另一个模型,您将 if 语句更改为:

if self.c.purchased_a == 0

不要在保存前使用 before_save 验证您的模型。您应该改用 validate。尝试这样的事情:

class Foo < ActiveRecord::Base
  belongs_to :c  # As you mark somewhere.
  validate :check_remaining

  def check_remaining
    errors.add(:base, "Some error message here") if c.purchased_a == 0
  end
end

说明

validate 用于向您的模型添加自定义验证。即使未保存模型,也会发生这种情况。您可以随时使用 model.errors 检查模型错误。

before_save 回调 happens after 模型验证。因此,在那里进行验证根本不起作用,因为它们不会被评估。 before_save 用于设置一个属性,或者计算一些值,诸如此类。

希望对您有所帮助!

模型中捕获错误的标准方法:

如此处所述ActiveModel::Errors < Object

class Foo < ActiveRecord::Base

  # Required dependency for ActiveModel::Errors
  extend ActiveModel::Naming

  def initialize
    @errors = ActiveModel::Errors.new(self)
  end

  attr_accessor :purchased_a
  attr_reader   :errors

  def validate!
    errors.add(:purchased_a, "Some error message here") if c.purchased_a == 0
  end

end

以上内容允许你做:

Foo = Foo.new
Foo.validate!            # => ["Some error message here"]
Foo.errors.full_messages # => ["purchased_a Some error message here"]

我不确定 c.purchased_ac 的来源是什么或哪里。 请修改它的代码。