首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写rails #破坏参数错误

重写rails #破坏参数错误
EN

Stack Overflow用户
提问于 2013-12-12 20:28:45
回答 1查看 1.3K关注 0票数 2

我的目标是:

重写rails中的# Devise方法,以便像Devise这样的宝石能够执行软删除。

我的尝试:

代码语言:javascript
复制
def destroy(mode = :soft)  
  if mode == :hard  
    super  
  else  
    ... soft-delete actions ...  
  end  
end  

当它在对象上被调用时.

ArgumentError:错误的参数数(1对0)

我希望这默认为软删除,但可以选择完全销毁对象。我的方法可能不是最好的方法,但任何建议都会有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-12 20:31:43

它应该是

代码语言:javascript
复制
super()

以下是完整的实现

代码语言:javascript
复制
def destroy(mode = :soft)  
  if mode == :hard  
    super()
  else  
    ... soft-delete actions ...  
  end  
end

原因是当您调用super而不传递任何参数时,Ruby将调用父方法传递传递给原始方法的相同参数。

但是,由于Rails中的原始destroy方法不带任何参数,因此结果是错误的。

代码语言:javascript
复制
ArgumentError: wrong number of arguments (1 for 0)

因为你的电话被翻译成

代码语言:javascript
复制
if mode == :hard  
  super(mode)

使用super() (带空())强制Ruby不向父方法传递参数。

作为附带说明,我通常更喜欢“重命名”旧对象,而不是重写它。

代码语言:javascript
复制
alias _destroy destroy

def destroy(mode = :soft)  
  if mode == :hard  
    _destroy
  else  
    ... soft-delete actions ...  
  end  
end

这样,您仍将保留对原始_destroy的引用。

更好的是,我更喜欢公开自定义API,而不是覆盖Rails默认方法。它帮助我公开一个与ActiveRecord内部松散耦合的自定义API。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20553576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档