在模块中使用FriendlyId

时间:2015-03-21 14:39:58

标签: ruby-on-rails ruby module friendly-url friendly-id

我在很多模特中使用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'

有没有办法让这个工作没有我必须为我的每个模型的扩展声明权利?

1 个答案:

答案 0 :(得分:2)

您可以让您的模块扩展您对其中包含的类的友好。

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