在某些情况下,我想在我的 Rails 模型中捕获和删除方法调用。
我想要类似的东西remove_method
,但这会删除方法调用。
例如,如果我before_save
在模型中有回调,我可能想使用扩展到类中的模块来捕获它,并删除或阻止before_save
触发。
这可能吗?
谢谢。
在某些情况下,我想在我的 Rails 模型中捕获和删除方法调用。
我想要类似的东西remove_method
,但这会删除方法调用。
例如,如果我before_save
在模型中有回调,我可能想使用扩展到类中的模块来捕获它,并删除或阻止before_save
触发。
这可能吗?
谢谢。
编辑:
我发布的先前答案不起作用 - 不确定它是否曾经做过,但我隐约记得过去使用过。例如,要跳过回调,在子类的上下文中,您应该使用skip_callback
. 用法示例:
skip_callback :save, :before, :callback_method_name
或者,如果您想在特定条件下跳过回调:
skip_callback :save, :before, :callback_method_name, if: :some_condition_true?
还有一种reset_callbacks
方法,将回调类型作为参数。例如,reset_callbacks :save
。回调可以通过类方法 ,_save_callbacks
等访问_create_callbacks
。我在使用时要小心,reset_callbacks
因为 Rails 本身似乎正在为关联定义回调,即:before_save_collection_association
.
如果您只是在谈论常规的 Ruby 对象,则可以覆盖子类中的方法。只需定义一个与超类同名的方法。您还可以通过包含一个定义与基类相同的实例方法的模块来覆盖子类中的基类方法。
您是否尝试过before_save
像这样清除:
before_save ->{}