在模块中使用 FriendlyId

Posted

技术标签:

【中文标题】在模块中使用 FriendlyId【英文标题】:Using FriendlyId inside a module 【发布时间】:2015-05-24 21:21:06 【问题描述】:

我在我的许多模型中都使用了 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'

有没有什么方法可以在我不必为我的每个模型正确扩展声明的情况下使其工作?

【问题讨论】:

您是否在每个课程中都包含此测试模块? 是的,但不幸的是仍然出现错误。 并且您希望您的模块扩展它所包含的类的friendlyid 正确吗? 是的,没错。目标是将should_generate_new_friendly_id 方法和extend FriendlyId; friendly_id :name, use: :slugged 放入模块中,这样我就可以在需要它的类中使用include TestModule 【参考方案1】:

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

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

【讨论】:

参数class 是允许的还是只是一个设计怪癖? 我无法命名参数class,但它确实引用了包含此模块的类 仍然收到undefined method 'friendly_id' for TestModule:Module 我刚注意到那是两行带分号的行,第二部分在错误的上下文中运行,请稍等修复它 尝试使用klass.friendly_id :name, use: :slugged 而不仅仅是friendly_id ...

以上是关于在模块中使用 FriendlyId的主要内容,如果未能解决你的问题,请参考以下文章

React 项目无法在 git 子模块中使用节点模块

模块之使用模块

Python 中 time 模块与 datetime 模块在使用中的不同之处

GO语言(十一):开始使用多模块工作区

如何创建要在任何模块中使用的指令?

在 NPM 注册表中发布的 Typescript 模块 - 在不同项目中使用时找不到模块