我正在尝试在 Rails 中推出自己的存档,但我无法弄清楚如何为旧的 destroy
设置别名覆盖它之前的方法。以下是我想做的,但我得到了 NoMethodError
因为destroy
在模块中之前没有定义。如果我把它放在 InstanceMethods
中,它会按照我期望的方式工作。模块,但这似乎已被弃用。我应该用 Vanilla 模块处理它还是有办法用 ActiveSupport::Concern
?
module Trashable
extend ActiveSupport::Concern
included do
default_scope where(deleted_at: nil)
end
module ClassMethods
def deleted
self.unscoped.where(self.arel_table[:deleted_at].not_eq(nil))
end
end
alias_method :destroy!, :destroy
def destroy
run_callbacks(:destroy) do
update_column(:deleted_at, Time.now)
end
end
end
最佳答案
你混合了几件事。
1 - 销毁确实不存在在包含模块的类(class)中在你包含你的模块之前。
长话短说,你的 ORM gem 可能为你生成并包含了 destroy 方法。
您可以使用 ruby 2+ prepend确保您的模块在所有方法都存在之后出现。
2 - 您可以使用原版模块或 ActiveSupport::Concern
只要你得到你想要的并且知道你在做什么。ActiveSupport::Concern
的点主要是管理模块层次结构。如果你有一个级别,我认为使用它没有意义。我想混prepend
与 ActiveSupport::Concern
这不是一个好主意。
(毕竟,ActiveSupport::Concern
最终只是普通的 Vanilla 模块。)
3 - 在保留旧方法的同时覆盖方法的推荐方法是使用 alias_method_chain .
然后,您将有一个可用的 destroy_without_archive 方法,这将是旧的方法(在您覆盖它之前)。
关于ruby-on-rails - 如何使用 ActiveSupport::Concern 使用别名方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18862497/