如何在gem中覆盖一个rails生成器模板?[英] How to override a rails generator template in a gem?

本文是小编为大家收集整理的关于如何在gem中覆盖一个rails生成器模板?的处理方法,想解了如何在gem中覆盖一个rails生成器模板?的问题怎么解决?如何在gem中覆盖一个rails生成器模板?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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

如果你想用宝石做这件事怎么办?我正在尝试采用我团队的标准化脚手架格式并将其gemify,以便我们可以在所有项目中共享它并轻松更新它,而不是在每个项目中将文件复制到 lib/中.这适用于我创建新生成器的情况;我使用 application.rb 中的 config.generators 连接到它,Rails 找到了它.但是当我将模板文件放到 gem 中的 lib/templates 中时,Rails 会首先找到它自己的默认模板,然后渲染它们而不是我的.我认为搜索顺序是 RAILS_ROOT/lib/templates、RAILS_GEMS/lib/templates、OTHER_GEMS/lib/templates.

解决办法是什么?我在这方面没有找到太多的文档,并且通过 Rails 进行代码潜水并没有提供明显的解决方案.谢谢!

推荐答案

我们想通了.生成器配置有一个"模板"变量,列出了模板的搜索路径.问题确实在于它会按顺序搜索这个数组,直到找到匹配项,因此在您的应用程序或 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 

如果模板在 [GEM]/lib/templates 中的路径与您要覆盖的默认模板的路径匹配,则应该可以.例如,如果您已完成此操作并创建 [GEM]/lib/templates/active_record/model/model.rb,它将覆盖默认的 AR 模型模板.

不需要对生成器进行猴子补丁.

编辑:请注意,自从最初发布此答案以来,"config.generators"已从 Rails 中删除.根据下面pixelearth的回答,使用 config.app_generators 代替.

本文地址:https://www.itbaoku.cn/post/786410.html