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)
| 归档时间: |
|
| 查看次数: |
2139 次 |
| 最近记录: |