在rails admin

时间:2016-02-25 18:49:00

标签: ruby-on-rails callback 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中显示的错误消息。在他们点击保存之后,我希望显示错误消息,但实际上会创建对象。

3 个答案:

答案 0 :(得分:1)

保存前请勿使用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

希望这对你有帮助!

答案 1 :(得分:0)

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

if self.c.purchased_a == 0

答案 2 :(得分:0)

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

如此处所述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_a c 的来源是什么或在哪里。 请修改它的代码。