Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 如何在gem中重写rails生成器模板?_Ruby On Rails 3_Templates_Gem_Generator - Fatal编程技术网

Ruby on rails 3 如何在gem中重写rails生成器模板?

Ruby on rails 3 如何在gem中重写rails生成器模板?,ruby-on-rails-3,templates,gem,generator,Ruby On Rails 3,Templates,Gem,Generator,当您想要覆盖生成器模板(而不替换生成器本身)时,在Rails 3中,您只需将文件放到lib/templates中适当命名的位置,Rails就会找到它们 如果你想用宝石做这个怎么办?我正在尝试采用我的团队的标准化脚手架格式并将其配对,这样我们就可以在所有项目中共享并轻松更新它,而不是在每个项目中将文件复制到lib/中。对于我创建了一个新的生成器的情况,这很好;我用application.rb中的config.generators钩住它,Rails找到了它。但是,当我将模板文件放入gem中的lib/

当您想要覆盖生成器模板(而不替换生成器本身)时,在Rails 3中,您只需将文件放到lib/templates中适当命名的位置,Rails就会找到它们

如果你想用宝石做这个怎么办?我正在尝试采用我的团队的标准化脚手架格式并将其配对,这样我们就可以在所有项目中共享并轻松更新它,而不是在每个项目中将文件复制到lib/中。对于我创建了一个新的生成器的情况,这很好;我用application.rb中的config.generators钩住它,Rails找到了它。但是,当我将模板文件放入gem中的lib/templates中时,Rails会首先找到自己的默认模板,并呈现它们,而不是我的模板。我认为搜索顺序是RAILS\u ROOT/lib/templates、RAILS\u GEMS/lib/templates、OTHER\u GEMS/lib/templates


解决办法是什么?我在这方面找不到多少docco,通过Rails进行代码潜水并没有提供一个明显的解决方案。谢谢

我们解决了这个问题。generators配置有一个“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 
模块MyGem
类Railtie
如果模板在[GEM]/lib/templates中有一个路径与您要覆盖的默认模板的路径相匹配,则应该可以这样做。例如,如果您完成了此操作并创建了[GEM]/lib/templates/active_record/model/model.rb,它将覆盖默认的AR模型模板

不需要对发电机进行修补


编辑:请注意,由于最初发布了此答案,“config.generators”已从Rails中删除。根据pixelearth下面的答案,使用
config.app\u生成器

更新:IdahoEv的答案正确,但从3.1开始,此代码会产生以下去润滑警告:

DEPRECATION WARNING: config.generators in Rails::Railtie is deprecated. Please use config.app_generators instead.
所以用这个来代替:

module MyGem
  class Railtie < Rails::Railtie
    config.app_generators do |g|
      g.templates.unshift File::expand_path('../templates', __FILE__)
    end 
  end
end 
模块MyGem
类Railtie
对于rails 4和rails引擎,我可以这样做:

module MyEngine
  class Engine < ::Rails::Engine
    isolate_namespace MyEngine

    config.generators do |g|
      g.templates.unshift File::expand_path("../templates", File.dirname(__FILE__))
    end
  end
end
模块MyEngine
类引擎<::Rails::引擎
分离出MyEngine
config.do | g|
g、 templates.unshift文件::展开\u路径(“../templates”,File.dirname(\uuuu文件)
结束
结束
结束

只有g.templates.unshift File::expand_path(“../../templates”,“文件”)中的路径“../../templates”对我有效。rails 3.2中的Im使用rails 4.1.5时也会遇到同样的问题。这是一个拼图解决方案

首先,在您的宝石中创建Railtie。 请记住,config.generators已被弃用,并且已过时


如果有人对此感到困惑,我只是得到了一个非常基本的gem,使用这里的其他答案,您可以看到一个例子:

无法让它工作。我做错了什么?我在
[GEM]/lib/my_GEM.rb
中有上面的文件(根据@pixelearth的回答稍作修改),在
[GEM]/lib/templates/active_record/model/model/model.rb
中有一个模型模板,在my
my_GEM.gempec`文件中有一行
s.files=[“lib/my_GEM.rb”]。。。但是如果我创建一个新的rails应用程序,在gem文件中包含并安装
my_gem
,然后生成一个新模型,它仍然使用默认模型。我错过了一个步骤吗?啊,明白了-我需要通过将模板文件添加到gempec中的
文件中,将其包含在gem中。你也可以通过这种方式覆盖其他gem中的模板
your_gem/lib/templates/coffee/assets/javascript.js.coffee
module SomeGem
  class Railtie < Rails::Railtie
    config.app_generators do |g|
      g.templates.unshift File::expand_path('../../templates', __FILE__)
    end
  end
end
# lib/your_engine/engine.rb
require 'your_gem_with_generator_templates' # Loads Railtie