raf*_*ch2 0 activerecord ruby-on-rails
覆盖rails中的#destroy方法,以便像Devise这样的宝石将执行软删除.
def destroy(mode = :soft)
if mode == :hard
super
else
... soft-delete actions ...
end
end
Run Code Online (Sandbox Code Playgroud)
当它在对象上被调用时它会得到...
ArgumentError:错误的参数个数(1表示0)
我想这个默认为软删除,但可以选择完全销毁对象.我的方法可能不是最好的方法,但任何建议都会有所帮助.
Sim*_*tti 10
它应该是
super()
Run Code Online (Sandbox Code Playgroud)
这是完整的实施
def destroy(mode = :soft)
if mode == :hard
super()
else
... soft-delete actions ...
end
end
Run Code Online (Sandbox Code Playgroud)
原因是因为当您调用super而不传递任何参数时,Ruby将调用父方法传递传递给原始方法的相同参数.
但是因为destroyRails中的原始方法不带参数,结果就是错误
ArgumentError: wrong number of arguments (1 for 0)
Run Code Online (Sandbox Code Playgroud)
因为你的电话被翻译成了
if mode == :hard
super(mode)
Run Code Online (Sandbox Code Playgroud)
使用super()(with empty ())强制Ruby不向父方法传递任何参数.
作为旁注,我通常更喜欢"重命名"旧对象,而不是覆盖它.
alias _destroy destroy
def destroy(mode = :soft)
if mode == :hard
_destroy
else
... soft-delete actions ...
end
end
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您仍将保留对原始_destroy的引用.
更好的是,我更喜欢暴露自定义API而不是重写Rails默认方法.它帮助我公开松散耦合到ActiveRecord内部的自定义API.
| 归档时间: |
|
| 查看次数: |
944 次 |
| 最近记录: |