覆盖rails中的#destroy方法,以便像Devise这样的宝石执行软删除。
def destroy(mode = :soft)
if mode == :hard
super
else
... soft-delete actions ...
end
end
当它在对象上调用时它会得到...
ArgumentError:参数数量错误(1表示0)
我希望默认为软删除,但可以选择完全销毁对象。我的方法可能不是最好的方法,但任何建议都会有所帮助。
答案 0 :(得分:9)
应该是
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()
(空()
)强制Ruby不向父方法传递任何参数。
作为旁注,我通常更喜欢“重命名”旧对象,而不是覆盖它。
alias _destroy destroy
def destroy(mode = :soft)
if mode == :hard
_destroy
else
... soft-delete actions ...
end
end
通过这种方式,您仍然可以保留对原始_destroy的引用。
更好的是,我更喜欢公开自定义API而不是重写Rails默认方法。它帮助我公开松散耦合到ActiveRecord内部的自定义API。