如何在gem中覆盖Rails Generator模板?

| 如果要覆盖生成器模板(不替换生成器本身),则可以在Rails 3中将文件放在lib / templates中适当命名的位置,Rails会找到它们。 如果要使用宝石怎么办?我正在尝试采用我团队的标准化支架格式并将其形象化,以便我们可以在所有项目中共享并轻松更新它,而不是在每个项目中将文件复制到lib /中。在我创建了新生成器的情况下,这很好用;我在application.rb中使用config.generators挂接到它,Rails找到了它。但是,当我将模板文件放到gem的lib / templates中时,Rails首先找到它自己的默认模板,然后渲染它们而不是我的模板。我认为搜索顺序为RAILS_ROOT / lib / templates,RAILS_GEMS / lib / templates,OTHER_GEMS / lib / templates。 有什么解决方案?我在这方面没有找到太多的文档,并且通过Rails进行代码划分还没有提出明显的解决方案。谢谢!     
已邀请:
更新:IdahoEv有正确的答案,但是从3.1版本开始,此代码会产生以下贬损警告:
DEPRECATION WARNING: config.generators in Rails::Railtie is deprecated. Please use config.app_generators instead.
所以改用这个:
module MyGem
  class Railtie < Rails::Railtie
    config.app_generators do |g|
      g.templates.unshift File::expand_path(\'../templates\', __FILE__)
    end 
  end
end 
    
我们想通了。生成器配置具有一个\'templates \'变量,该变量列出了模板的搜索路径。问题的确是,它会按顺序搜索此数组,直到找到匹配的内容,因此,您的应用程序或Rails中的模板将在gem中的模板之前被找到。 解决方案是让您宝石的Railtie将模板路径放在模板路径数组的开头。看起来像这样。该文件位于[GEM] /lib/my_gem.rb中。模板在[GEM] / lib / templates /中与之平行。
module MyGem
  class Railtie < Rails::Railtie
    config.generators do |g|
      g.templates.unshift File::expand_path(\'../templates\', __FILE__)
    end 
  end
end 
如果模板在[GEM] / lib / templates内具有与您要覆盖的默认模板的路径相匹配的路径,则此方法应该起作用。例如,如果您已完成此操作并创建了[GEM] /lib/templates/active_record/model/model.rb,它将覆盖默认的AR模型模板。 不需要生成器的monkeypatching。 编辑:请注意,由于此答案最初发布,\“ config.generators \”已从Rails中删除。按照下面的pixelearth答案,使用
config.app_generators
。     
我在使用Rails 4.1.5时遇到了同样的问题。这是组装的拼图解决方案。 首先,像这样在您的宝石中创建Railtie。 请记住,不赞成使用config.generators和thalespf的答案。
module SomeGem
  class Railtie < Rails::Railtie
    config.app_generators do |g|
      g.templates.unshift File::expand_path(\'../../templates\', __FILE__)
    end
  end
end
奇迹般有效! UPD。我试图用模板创建一个gem,并在Rails :: Engine中使用它。但这需要这样做:
# lib/your_engine/engine.rb
require \'your_gem_with_generator_templates\' # Loads Railtie
    
至于rails 4和rails引擎,我可以这样做:
module MyEngine
  class Engine < ::Rails::Engine
    isolate_namespace MyEngine

    config.generators do |g|
      g.templates.unshift File::expand_path(\"../templates\", File.dirname(__FILE__))
    end
  end
end
    
仅g.templates.unshift File :: expand_path(\'../../ templates \',_ FILE _)中的路径\'../../ templates \'对我有用。即时通讯3.2     
如果有人为此苦苦挣扎,我只是使用其他答案在这里得到了一个非常基本的宝石,您可以在其中看到一个示例:模板     

要回复问题请先登录注册