它应该是
super()
这是完整的实施
def destroy(mode = :soft) if mode == :hard super() else ... soft-delete actions ... end end
原因是因为当您调用super
而不传递任何参数时,Ruby将调用父方法传递传递给原始方法的相同参数.
但是因为destroy
Rails中的原始方法不带参数,结果就是错误
ArgumentError: wrong number of arguments (1 for 0)
因为你的电话被翻译成了
if mode == :hard super(mode)
使用super()
(with empty ()
)强制Ruby不向父方法传递任何参数.
作为旁注,我通常更喜欢"重命名"旧对象,而不是覆盖它.
alias _destroy destroy def destroy(mode = :soft) if mode == :hard _destroy else ... soft-delete actions ... end end
通过这种方式,您仍将保留对原始_destroy的引用.
更好的是,我更喜欢暴露自定义API而不是重写Rails默认方法.它帮助我公开松散耦合到ActiveRecord内部的自定义API.