Как переопределить шаблон генератора рельсов в драгоценном камне? - PullRequest
16 голосов
/ 14 апреля 2011

Когда вы хотите переопределить шаблон генератора (без замены самого генератора), в Rails 3 вы можете просто отбросить файлы в местах с соответствующим именем в lib / templates, и Rails найдет их.

Что если выхотите сделать это с драгоценным камнем?Я пытаюсь взять стандартизированный формат scaffold моей команды и создать его, чтобы мы могли делиться им во всех проектах и ​​легко обновлять его, а не копировать файлы в lib / в каждом проекте.Это хорошо работает для случаев, когда я создал новый генератор;Я подключаюсь к нему с помощью config.generators в application.rb, и Rails находит его.Но когда я помещаю файлы шаблонов в lib / templates в gem , Rails сначала находит свои собственные шаблоны по умолчанию и отображает их вместо моих.Я думаю, что порядок поиска - RAILS_ROOT / lib / templates, RAILS_GEMS / lib / templates, OTHER_GEMS / lib / templates.

Какое решение?Я не нахожу много об этом, и погружение в код через Rails не представило очевидного решения.Спасибо!

Ответы [ 6 ]

10 голосов
/ 02 октября 2011

Обновление: 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 
10 голосов
/ 30 апреля 2011

Мы поняли это.В конфигурации генератора есть переменная templates, в которой перечислены пути поиска шаблонов.Проблема действительно в том, что он ищет этот массив по порядку, пока не найдет совпадение, поэтому шаблоны в вашем приложении или в Rails будут найдены до шаблонов в вашем геме.

Решение состоит в том, чтобы 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.Вместо этого используйте config.app_generators согласно ответу pixelearth ниже.

3 голосов
/ 28 августа 2014

У меня такая же проблема с использованием рельсов 4.1.5.И вот собранное решение головоломки.

Прежде всего, создайте Railtie в своем драгоценном камне , как это .Помните, что config.generators устарели и ответ thalespf .

module SomeGem
  class Railtie < Rails::Railtie
    config.app_generators do |g|
      g.templates.unshift File::expand_path('../../templates', __FILE__)
    end
  end
end

Работает как шарм!

UPD.Я попытался создать гем только с шаблонами и использовать его в Rails :: Engine.Но для этого необходимо:

# lib/your_engine/engine.rb
require 'your_gem_with_generator_templates' # Loads Railtie
1 голос
/ 20 июня 2014

У меня работал только путь '../../templates' в файле g.templates.unshift File :: expand_path ('../../ templates', _ FILE _).Я в рельсах 3,2

1 голос
/ 24 марта 2014

Что касается рельсов 4 и двигателя рельсов, я могу сделать это как:

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
0 голосов
/ 05 декабря 2014

Если кто-то борется с этим, я только что получил очень простой гем, работающий, используя другие ответы здесь, которые вы можете увидеть для примера: templates

...