我的目标是:
重写rails中的# Devise方法,以便像Devise这样的宝石能够执行软删除。
我的尝试:
def destroy(mode = :soft)
if mode == :hard
super
else
... soft-delete actions ...
end
end 当它在对象上被调用时.
ArgumentError:错误的参数数(1对0)
我希望这默认为软删除,但可以选择完全销毁对象。我的方法可能不是最好的方法,但任何建议都会有帮助。
发布于 2013-12-12 20:31:43
它应该是
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。
https://stackoverflow.com/questions/20553576
复制相似问题