我知道如何覆盖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
答案 0 :(得分:4)
在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