在模块中使用 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的主要内容,如果未能解决你的问题,请参考以下文章