【问题标题】:How to add custom model modifier like in most gems?如何像大多数宝石一样添加自定义模型修饰符?
【发布时间】:2013-02-01 15:51:17
【问题描述】:

我想 DRY 一些模型功能,就像很多宝石一样。 例如,在 gem acts-as-taggable-on 中,我们只需将 acts_as_taggable 添加到任何模型即可启用标记。 如何将我自己的 include_god_mode 模型修饰符添加到我的 rails 项目中?

【问题讨论】:

  • 您可能不应该这样做。相反,您应该提供一个可以混合到您的模型中的模块。
  • 我需要将此模块包含到 f.e. ActiveModel 在所有模型中都可用?
  • 不,您应该将它包含在真正需要它的模型中。关键是你不应该用这样的功能污染每个模型
  • 但我不想写“include MyModule::feature”。我想写像“acts_as_taggable”但“my_feature”。我该如何实现它?

标签: ruby-on-rails ruby rubygems mixins


【解决方案1】:

所以我发现它是通过简单的类扩展和混合来实现的。

例如,在acts-as-taggable-on gem 中,有很多模块包含在 ActiveRecord::Base 中,因此模型中的acts_as_taggable 只是语法糖。

这里是acts-as-taggable-on 来源,包括:

if defined?(ActiveRecord::Base)
  ActiveRecord::Base.extend ActsAsTaggableOn::Taggable
  ActiveRecord::Base.send :include, ActsAsTaggableOn::Tagger
end

if defined?(ActionView::Base)
  ActionView::Base.send :include, ActsAsTaggableOn::TagsHelper
end

因此,如果我想在我的模型中添加这样的糖,我需要在 ActiveRecord::Base(或 ActiveRecord ORM 的类似超类)中包含一个方法,该方法将在我的东西中包含模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多