如何在before_add关联回调中取消保存?

时间:2012-07-20 14:50:15

标签: ruby-on-rails-3 activerecord exception-handling has-many model-associations

如果重复,我正在尝试取消has_many元素的保存(优雅)。这就是我的意思:

class AdmininstratorRole < ActiveRecord::Base
   has_many :permissions, before_add: :avoid_repetition

   def avoid_repetition(permission)
     raise "Repeated Permission" if self.permissions.where(klass: permission.klass, action: permission.action).count > 0
   end
end

如果它不是一个关联的回调,我可以返回false,这将取消保存。但由于是一个关联的回调,我需要引发异常以取消保存,如here所述。问题是我不知道如何从该异常中优雅地恢复。

任何想法???

1 个答案:

答案 0 :(得分:0)

您需要从添加权限角色的任何代码中捕获异常。

begin
  role.permissions.add(permission)
rescue
  # do whatever should happen here.
end

尽管如此,您可能需要在尝试添加权限之前检查该权限是否存在。