Как переопределить шаблон генератора рельсов в драгоценном камне?
Если вы хотите переопределить шаблон генератора (без замены самого генератора), в 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.
Какое решение? Я не нахожу много docco на этом, и кодовое погружение через Rails не представило очевидного решения. Спасибо!
Ответы
Ответ 1
Мы поняли это. Конфигурация генераторов имеет переменную "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 ниже.
Ответ 2
Обновление: 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
Ответ 3
У меня такая же проблема с использованием рельсов 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
Ответ 4
Как и для рельсов 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
Ответ 5
Для меня работал только путь "../../templates" в файле g.templates.unshift File:: expand_path ('../../templates', _ FILE _). Im в рельсах 3.2
Ответ 6
Если кто-то борется с этим, я просто получил очень простой камень, используя другие ответы здесь, которые вы можете увидеть для примера: templates