如何通信多个before_ *回调中的哪一个停止执行

时间:2011-08-24 16:23:14

标签: ruby-on-rails callback

before_ *回调可以通过返回false来暂停执行。

我在模型上有3个before_destroy回调,以暂停销毁,原因有几种。我想告诉用户它是什么原因,但我会从模型中恢复.destroy是假的。如何从模型中发送消息,或从控制器确定before_destroy回调暂停执行?

3 个答案:

答案 0 :(得分:1)

这是一个很好的问题。我不知道是否有一个好方法。我唯一想到的就是使用错误[:base],但这听起来有点像黑客。

答案 1 :(得分:1)

这里没有什么好的答案 - How do I 'validate' on destroy in rails

基本上解决方案将是

errors.add_to_base "Name of the error"

OR

你可以在模型中定义attr_accessor并适当地设置它们,即使我认为这不是最干的方式,因为该对象已经有错误属性hash,它应该容纳错误。

EX是:

attr_accessor :before_save_error1
attr_accessor :before_save_error2
attr_accessor :before_save_error3

before_destroy :check_for_errors

def check_for_errors 
  error = false
  if error1 # some condition here 
    self.before_save_error1 = true
    error = true 
  elsif error2 # some condition here 
    self.before_save_error2 = true
    error = true
  elseif error3 # some condition here 
    self.before_save_error3 = true
    error = true   
  end 

  error
end 

答案 2 :(得分:0)

找到答案。使用:

  

errors.add:my_key,'my msg'

错误只是一个哈希,可以处理任何密钥。只需确保您的属性没有名称冲突。