在模块中使用 FriendlyId

Using FriendlyId inside a module

我在我的许多模型中使用 FriendlyId。我注意到我的代码在创建更新 url 的功能方面有些冗余,所以我决定将它放在一个模块中:

module TestModule
  def should_generate_new_friendly_id?
    name_changed?
  end
end

现在的问题是,如果我将创建 slug 所需的基本代码行从我的 类 中提取到我的模块中

extend FriendlyId; friendly_id :name, use: :slugged

我收到此错误:

undefined method `relation' for class `Module'

有没有什么方法可以让它工作而不必为我的每个模型正确扩展声明?

您可以让您的模块为包含它的 类 扩展友好度。

module TestModule
  def self.included(klass)
    klass.extend FriendlyId
    klass.class_eval do
      friendly_id :name, use: :slugged
    end
    include InstanceMethods
  end
  module InstanceMethods
    def should_generate_new_friendly_id?
      name_changed?
    end
  end
end

然后在你的模型中你将只包含这个

class MyModel < ActiveRecord::Base
  include TestModule
  # the rest of the class
end

你也可以在没有额外模块的情况下做到这一点

module TestModule
  def self.included(klass)
    klass.extend FriendlyId
    klass.class_eval do
      friendly_id :name, use: :slugged
      def should_generate_new_friendly_id?
        name_changed?
      end
    end
  end
end