如何在Rails应用程序中覆盖gem generator模板

equ*_*nt8 2 rubygems ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我知道如何在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可以生成我的模板,而不是gem本机模板

谢谢

Nim*_*mir 5

关于发电机的Rails指南

在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

...等等

  • @ equivalent8这是一个非常疯狂的猜测,但是尝试`lib / templates / pundit / policy / policy.rb`。 (2认同)