gpt4 book ai didi

ruby-on-rails - 覆盖 rails #destroy 参数错误

转载 作者:行者123 更新时间:2023-12-05 08:28:09 25 4
gpt4 key购买 nike

我的目标:

重写 rails 中的#destroy 方法,以便像 Devise 这样的 gem 将执行软删除。

我的尝试:

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

当在对象上调用它时,它得到...
ArgumentError:参数数量错误(1 代表 0)

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

最佳答案

应该是

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。

关于ruby-on-rails - 覆盖 rails #destroy 参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20553576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com