Как заставить генераторы вызывать другие генераторы в рельсах 3 - PullRequest
13 голосов
/ 05 мая 2011

Я экспериментирую с разработкой драгоценных камней, сейчас специально для генераторов.До сих пор я успешно создал два генератора, которые отлично справляются со своей работой.Эти два генератора находятся в одном каталоге.

Однако сейчас я должен вызвать каждый из них по отдельности.

Что я хотел бы сделать, это просто вызвать один генератор и получить этот генераторназови всех остальных.Просто наберите

rails g generator_name

и это вызовет x других генераторов.

Кто-нибудь знает, как бы я поступил об этом?

Помощь очень ценится, спасибо!

Ответы [ 4 ]

22 голосов
/ 06 мая 2011

В своем генераторе вы можете просто позвонить

generate "some:generator" # can be anything listed by 'rails g'

, например:

module MyGem
  class InstallGenerator < Rails::Generators::Base

    def run_other_generators
      generate "jquery:install" # or whatever you want here
    end

  end
end

Кстати, если вы работаете с гемами Rails 3, этот вопрос также может помочьout:

Rails 3 генератора в гем

9 голосов
/ 19 августа 2012

Еще одна возможность - использовать что-то вроде

invoke 'active_record:model', 'foo bar:string baz:float'

, которое не так чисто, как generate, но имеет одно преимущество: когда ваш генератор вызывается через rails destroy, этот вызов можетдругие действия Thors - попытка отменить действие генератора, которого вы invoke.

Однако есть одна загвоздка: вероятно, из-за управления зависимостями Thors, это работает только один раз для каждого генератора, который вы хотите вызвать, то естьчто второй invoke того же генератора ничего не сделает.Это можно обойти, используя вместо этого оператор типа

Rails::Generators.invoke 'active_record:model', '...', behavior: behavior

.В этом случае вы должны явно пройти через behavior вашего генератора (это метод, возвращающий значения типа :invoke, :revoke и, возможно, другие, в зависимости от того, какая команда - rails generate, rails destroy, rails update и т. Д. - называется вашим генератором) для достижения того же результата, что и выше.Если вы этого не сделаете, генератор, который вы вызываете с помощью Rails::Generators.invoke, также будет выполняться при запуске вашего генератора с rails destroy.

В качестве альтернативы вы можете придерживаться invoke и попытаться вмешаться в вызов Thorsсистема.См. Также здесь , например.

1 голос
/ 05 мая 2011

Генераторы основаны на Торе, поэтому вы можете использовать метод применения .

Это то, что делает Rails Templater gem . ( Вот прогулка по жемчужине Rails Templater.)

0 голосов
/ 05 мая 2011

Посмотрите на генератор строительных лесов, который поставляется с рельсами.

/ Пользователи / XYZ / источники / рельсы / Railties / Библиотека / rails_generator / генераторы / компоненты / леска / scaffold_generator.rb

def manifest
    record do |m|
      #....rest of the source is removed for brevity....
      m.dependency 'model', [name] + @args, :collision => :skip
    end
  end

Здесь генератор строительных лесов использует генератор моделей. Итак, взгляните на метод зависимости. Вы можете найти документацию по API для здесь .

...