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

Как заставить генераторы вызвать другие генераторы в рельсах 3

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

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

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

rails g generator_name

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

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

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

4b9b3361

Ответ 1

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

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 камнями, этот вопрос также может помочь:

Генераторы Rails 3 в самоцвете

Ответ 2

Другая возможность - использовать что-то вроде

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. См. Также здесь.

Ответ 3

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

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

Ответ 4

Взгляните на генератор эшафотов, который поставляется с рельсами.

/Users/XYZ/sources/rails/railties/lib/rails_generator/generators/components/scaffold/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 для него здесь.