如何覆盖gem中的rails生成器模板?

Ida*_*oEv 16 gem templates generator ruby-on-rails-3

如果要覆盖生成器模板(不替换生成器本身),在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.

解决方案是什么?我在这方面找不到很多docco,并且通过Rails进行代码跳转没有提供明显的解决方案.谢谢!

Ida*_*oEv 10

我们想通了.generators config有一个'templates'变量,列出模板的搜索路径.问题确实是它按顺序搜索此数组,直到找到匹配项,因此您的应用程序或Rails中的模板将在gem中的模板之前找到.

解决方案是让您的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 
Run Code Online (Sandbox Code Playgroud)

如果模板在[GEM]/lib/templates中有一条路径与您要覆盖的默认模板的路径相匹配,那么这应该有效.举例来说,如果你这样做,你创建[创业板] /lib/templates/active_record/model/model.rb,它将覆盖默认的AR模型模板.

不需要对生成器进行monkeypatching.

编辑:请注意,由于此答案最初发布,"配置生成器"已从Rails中删除.请config.app_generators根据pixelearth的答案使用以下内容.


pix*_*rth 10

更新:IdahoEv有正确的答案,但此代码,从3.1开始产生以下的删除警告:

DEPRECATION WARNING: config.generators in Rails::Railtie is deprecated. Please use config.app_generators instead.
Run Code Online (Sandbox Code Playgroud)

所以请改用:

module MyGem
  class Railtie < Rails::Railtie
    config.app_generators do |g|
      g.templates.unshift File::expand_path('../templates', __FILE__)
    end 
  end
end 
Run Code Online (Sandbox Code Playgroud)