Подтвердить что ты не робот

Как переопределить шаблон генератора рельсов в драгоценном камне?

Если вы хотите переопределить шаблон генератора (без замены самого генератора), в 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 не представило очевидного решения. Спасибо!

4b9b3361

Ответ 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