覆盖rails #destroy参数错误
我的目标:
覆盖rails中的#destroy方法,以便像Devise这样的gem将执行软删除。
我的尝试:
def destroy(mode = :soft) if mode == :hard super else ... soft-delete actions ... end end
当它在对象上被调用时它得到…
ArgumentError:参数个数错误(1表示0)
我想这个默认为软删除,但可以选择完全销毁对象。 我的方法可能不是最好的方法,但任何建议都会有所帮助。
它应该是
super()
这是完整的实施
def destroy(mode = :soft) if mode == :hard super() else ... soft-delete actions ... end end
原因是因为当你调用super
而不传递任何参数时,Ruby将调用父方法传递传递给原始方法的相同参数。
但是因为Rails中的原始destroy
方法不带参数,结果就是错误
ArgumentError: wrong number of arguments (1 for 0)
因为你的电话被翻译成了
if mode == :hard super(mode)
使用super()
(使用empty ()
)强制Ruby不向父方法传递任何参数。
作为旁注,我通常更喜欢“重命名”旧对象,而不是覆盖它。
alias _destroy destroy def destroy(mode = :soft) if mode == :hard _destroy else ... soft-delete actions ... end end
通过这种方式,您仍将保留对原始_destroy的引用。
更好的是,我更喜欢暴露自定义API而不是重写Rails默认方法。 它帮助我公开松散耦合到ActiveRecord内部的自定义API。
- Rails按以下方式对表进行分组:created_at,返回:status列的计数,然后将:status列分组,每个唯一值的计数
- Rails:基于多个参数过滤?
- Rails 4 x paper_trail:使用嵌套资源按item_id过滤版本
- 使用rails嵌套模型来创建*外部对象并同时*编辑*现有的嵌套对象?
- 使用ruby和active_record保存时的DEPRECATION WARNING
- validationRspec和Rails中的布尔值
- Rails:需要帮助定义地址表的关联
- 如何在Rails之外的多环境中使用ActiveRecord?
- Rails – AciveRecord使用:dependent =>:在条件下销毁