如何在Rails应用程序中覆盖gem生成器模板

时间:2014-02-12 15:35:28

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 rubygems

我知道如何覆盖gem中的Rails模板,但是如何在Rails应用程序中覆盖gem generator模板

例如:https://github.com/elabs/pundit/blob/master/lib/generators/pundit/policy/templates/policy.rb

https://github.com/drapergem/draper/blob/master/lib/generators/rails/templates/decorator.rb

以便rails g decorator Foo生成我的模板,而不是宝石原生的

THX

3 个答案:

答案 0 :(得分:4)

来自Rails guide on generators

  

在Rails 3.0及更高版本中,生成器不只是查看源根目录   对于模板,他们还搜索其他路径中的模板。一个   它们是lib / templates。

所以,如果你模仿你试图覆盖的gem / tamplate的目录层次结构,rails会选择你的模板而不是gem源中的模板

<强>更新

现在,问题是如何正确模仿该层次结构,以便rails选择你的模板?

事实证明,有一种规则|例如,如果您要覆盖此路径中的模板:lib/generators/pundit/policy/templates/policy.rb

您应该将模板放在lib/templates/pundit/policy/policy.rb

覆盖lib/generators/rails/templates/decorator.rb

您应该将模板放在lib/templates/rails/decorator/decorator.rb

更新2

似乎模式正在流动:lib/templates/gem_name/generator_name/template_file_name.rb

如果是Draper gem,gem会强制自己像本机Rails生成器一样运行:

/draper/lib/generators/rails/templates/decorator.rb

...这就是我们需要使用的原因:

lib/templates/rails/generator_name/template_file_name.rb

要覆盖Draper gem的RSpec模板生成器: lib/templates/rspec/generator_name/template_file_name.rb

......等等

答案 1 :(得分:1)

要为twitter-bootswatch-rails gem的视图生成器自定义模板,请将its template folder的全部内容复制到

lib/templates/bootswatch/themed

并运行rails g bootswatch:themed YourModels

答案 2 :(得分:0)

要将默认Pundit生成器复制到Rails项目,可以使用以下命令:

mkdir -p lib/templates/pundit/policy && \
cp $(bundle show pundit)/lib/generators/pundit/policy/templates/* lib/templates/pundit/policy