Генераторы Rails 3 в gem

#ruby-on-rails #ruby-on-rails-3 #rubygems #generator

#ruby-on-rails #ruby-on-rails-3 #rubygems #генератор

Вопрос:

Может показаться простым вопросом, но я в тупике.

Я создал gem, который по сути содержит генератор.

Он содержит следующую структуру:

 lib
 - generators
    - my_generator
          my_generator_generator.rb (see below)
          - templates
             my_template_files...     
 - my_generator.rb (empty file)
test
 -test files
GemFile
etc..
  

Однако, когда я добавляю этот Gem в свой файл gem и запускаю rails g, его нет в списке. Есть ли какая-либо дополнительная конфигурация, которую мне нужно сделать?

Мой генератор примерно выглядит так…

 class MyGeneratorGenerator < Rails::Generators::NamedBase
      source_root File.expand_path('../templates', __FILE__)
      generator code....
 end
  

Странно то, что это работает в Cygwin, но не в Ubuntu…

Комментарии:

1. Это та же версия ruby / rails?

2. Да. Оба ruby 1.8, Rails 3.0

Ответ №1:

Мне потребовалось немного времени, чтобы разобраться, но я столкнулся с той же проблемой. Вот как я это исправил.

Древовидная структура выглядит следующим образом:

 lib
  - generators
    - gemname
      install_generator.rb
      - templates
        (template files)
  

Вот код для install_generator.rb

 #lib/generators/gemname/install_generator.rb
require 'rails/generators'
module Gemname
  class InstallGenerator < Rails::Generators::Base
    desc "Some description of my generator here"

    # Commandline options can be defined here using Thor-like options:
    class_option :my_opt, :type => :boolean, :default => false, :desc => "My Option"

    # I can later access that option using:
    # options[:my_opt]


    def self.source_root
      @source_root ||= File.join(File.dirname(__FILE__), 'templates')
    end

    # Generator Code. Remember this is just suped-up Thor so methods are executed in order


  end
end
  

Когда я запускаю
rails g

Я вижу:

 Gemname
   gemname:install
  

Некоторые другие вещи, которые вам могут понадобиться для настройки:

 #lib/gemname.rb
module Gemname
  require 'gemname/engine' if defined?(Rails)
  # any additional requires
end
  

и

 #/lib/gemname/engine.rb
require 'rails'
module Gemname
  class Engine < Rails::Engine
  end
end
  

Вот несколько хороших ссылок, которые я нашел по этому поводу:

Комментарии:

1. Спасибо. Это потрясающе. Подумал, что мне, должно быть, не хватает какого-то установочного файла. Отдаю должное исходному коду. Ссылки тоже полезны, спасибо.

Ответ №2:

Если вы используете Railtie, вы можете определить свой генератор везде, где он мог бы использоваться:

 generators do
    require "path/to/my_railtie_generator"
end
  

в классе Railtie.