ruby-on-rails - 如何使用 ActiveSupport::Concern 使用别名方法?

标签 ruby-on-rails activesupport

我正在尝试在 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的点主要是管理模块层次结构。如果你有一个级别,我认为使用它没有意义。我想混prependActiveSupport::Concern这不是一个好主意。

(毕竟,ActiveSupport::Concern 最终只是普通的 Vanilla 模块。)

3 - 在保留旧方法的同时覆盖方法的推荐方法是使用 alias_method_chain .

然后,您将有一个可用的 destroy_without_archive 方法,这将是旧的方法(在您覆盖它之前)。

关于ruby-on-rails - 如何使用 ActiveSupport::Concern 使用别名方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18862497/

相关文章:

ruby-on-rails - gem 如何显示在 "bundle show"而不是在 Gemfile 中?

ruby-on-rails - 如何使用属性填充 PDF 网络表单

ruby-on-rails - Rails - 设计/用户注册路线/POST

mysql - Rails ActiveSupport::JSON 导致非法指令错误

ruby-on-rails - 带有 ActiveSupport 的 Rails 4 ActiveRecord 模块

ruby-on-rails - Rails 中的 Postgres 查询 : where not

ruby-on-rails - 不知道如何构建任务 - cucumber

ruby-on-rails - 使用音译的 Rails 参数化不适用于阿拉伯语/Unicode 字符串

ruby-on-rails - ActiveSupport::类方法的回调

ruby-on-rails - 无法激活 activesupport (>= 2.3.2, runtime),已激活 activesupport-2.1.2。这是什么意思?