【问题标题】:How do I alias_method with ActiveSupport::Concern?如何使用 ActiveSupport::Concern 使用别名方法?
【发布时间】:2013-09-18 01:31:10
【问题描述】:

我正在尝试在 Rails 中滚动自己的存档,但在覆盖旧的 destroy 方法之前,我无法弄清楚如何为它起别名。下面是我想做的事情,但我得到了一个NoMethodError,因为在模块中之前没有定义destroy。如果我把它放在InstanceMethods 模块中,它会按照我期望的方式工作,但这似乎已被弃用。我应该用香草模块来处理它还是有办法用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

【问题讨论】:

标签: ruby-on-rails activesupport


【解决方案1】:

你混合了一些东西。

1 - 在包含模块之前,在包含模块的类中确实不存在destroy

说来话长,你的 ORM gem 可能会为你生成并包含 destroy 方法。

您可以使用 ruby​​ 2+ prepend 确保您的模块在所有方法都存在之后出现。

2 - 你可以使用 vanilla 模块或 ActiveSupport::Concern,只要你得到你想要的并且知道你在做什么。

ActiveSupport::Concern 的重点主要是管理模块层次结构。如果你有一个级别,我认为使用它没有意义。我认为将prependActiveSupport::Concern 混合不是一个好主意。

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

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

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

【讨论】:

    猜你喜欢
    • 2014-04-28
    • 2013-02-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2023-01-20
    • 2012-09-14
    相关资源
    最近更新 更多