2

我有一个 Rails 应用程序,它使用一个名为 ActsAsTaggableOnSteroids 的 gem,它是一个 Rails 引擎。具体来说,我正在使用PavelNartov 的宝石叉。但没关系。

我需要为Tag模型添加特定的功能,由引擎提供。

但是,根据我对 Rails 引擎的理解和 Rails 中神奇的加载功能,如果我在我的模型目录中放置一个名为“tag.rb”的文件,那么它将完全取代引擎中的那个。

理想情况下,我将能够执行以下操作:

class Tag < ActsAsTaggable::Tag
  # my stuff
end

...但是,这不起作用,因为引擎提供的模型没有命名空间。

所以,我想出了这个噩梦,我把它放进去app/models/tag.rb

path = ActsAsTaggable::Engine.config.eager_load_paths.grep(/models/).first
require File.join(path, 'tag')
Tag.class_eval { include TagConcern }

但是必须有更好的方法!我觉得我错过了什么。如果可能的话,我不想在我的应用程序中添加这种陌生感。

4

1 回答 1

2

只需通过查找 gem 模型的路径来获取文件:

require File.join(Gem::Specification.find_by_name("bborn-acts_as_taggable_on_steroids").gem_dir, 'app/models/tag')

Tag.class_eval do
  # ...
end
于 2013-06-28T05:21:21.947 回答