генераторы и миграции в плагинах (рельсы 3) - PullRequest
9 голосов
/ 10 ноября 2010

Я просто пытаюсь создать генератор миграции плагинов без каких-либо параметров, например: $rails generate yaffle, и это должно скопировать файл миграции (lib / generators / yaffle / template / create_yaffle.rb) в db / migrate / [timestamp]_create_yaffle.rb.

  1. Проблема, с которой я здесь сталкиваюсь, заключается в ее копировании, но без отметки времени.
  2. Кроме того, когда я запускаю $rails generate yaffle, он выдает мне сообщение о том, что аргументы не предоставлены,ожидает быть в этом формате rails generate yaffle NAME [options].Я не хочу иметь никаких опций / аргументов, это должно быть просто rails generate yaffle.

Что мне делать?

Я следовал за генератором, используемым в acts_as_commentable это выглядит довольно просто, но я не знаю, где изменить эти настройки ... кто-нибудь может помочь?

Код генератора:

require 'rails/generators'
require 'rails/generators/migration'

class ThumbitGenerator  Rails::Generators::NamedBase
  source_root File.expand_path('../templates', __FILE__)

  def self.next_migration_number(path)
    Time.now.utc.strftime("%Y%m%d%H%M%S")
  end

  def create_model_file
    template "like.rb", "app/models/like.rb"
    template "liking.rb", "app/models/liking.rb"
    template "create_likes.rb", "db/migrate/create_likes.rb"
    template "create_likings.rb", "db/migrate/create_likings.rb"
  end

end

Ответы [ 3 ]

22 голосов
/ 11 ноября 2010

Хорошо, я нашел ответ ...

  1. Я использовал Rails::Generators::NamedBase вместо Rails::Generators::Base в моем файле генератора!Когда вы используете NamedBase, он всегда ожидает передачи аргумента (который является именем инициализатора)

    Объяснение: guides.rubyonrails.org / generators

  2. И яиспользовал template метод вместо migration_template, из-за чего в файлах миграции не было получено ни одного номера миграции

    Объяснение: Rails :: Generators :: Migration.migration_template

Итак, наконец, это сработало!

require 'rails/generators'
require 'rails/generators/migration'

class ThumbitGenerator < Rails::Generators::Base
  include Rails::Generators::Migration
  source_root File.expand_path('../templates', __FILE__)

  def self.next_migration_number(path)
    Time.now.utc.strftime("%Y%m%d%H%M%S")
  end

  def create_model_file
    template "like.rb", "app/models/like.rb"
    template "liking.rb", "app/models/liking.rb"
    migration_template "create_likes.rb", "db/migrate/create_likes.rb"
    migration_template "create_likings.rb", "db/migrate/create_likings.rb"
  end
end
3 голосов
/ 14 июня 2013

Небольшая польза от решения - чтобы избавить себя от хлопот, связанных с определением временной метки для миграции и будущей защиты вашего генератора, в случае, если основная команда Rails решит использовать другой способ штамповки (например, хэши SHA, усеченные до 10 символов), вы можно require 'rails/generators/active_record' и extend ActiveRecord::Generators::Migration вот так:

require 'rails/generators'
require 'rails/generators/migration'
require 'rails/generators/active_record'

class ThumbitGenerator < Rails::Generators::Base
  include Rails::Generators::Migration
  extend ActiveRecord::Generators::Migration

  source_root File.expand_path('../templates', __FILE__)

  def create_model_file
    template "like.rb", "app/models/like.rb"
    template "liking.rb", "app/models/liking.rb"
    migration_template "create_likes.rb", "db/migrate/create_likes.rb"
    migration_template "create_likings.rb", "db/migrate/create_likings.rb"
  end
end

ОБНОВЛЕНИЕ В Rails 4 ActiveRecord::Generators::Migration больше не является модулем, поэтому используйте вместо него:

require 'rails/generators'
require 'rails/generators/migration'
require 'rails/generators/active_record'

class ThumbitGenerator < Rails::Generators::Base
  include Rails::Generators::Migration
  # Implement the required interface for Rails::Generators::Migration
  def self.next_migration_number(dirname)
    ActiveRecord::Generators::Base.next_migration_number(dirname)
  end

  source_root File.expand_path('../templates', __FILE__)

  def create_model_file
    template "like.rb", "app/models/like.rb"
    template "liking.rb", "app/models/liking.rb"
    migration_template "create_likes.rb", "db/migrate/create_likes.rb"
    migration_template "create_likings.rb", "db/migrate/create_likings.rb"
  end
end
1 голос
/ 22 мая 2013

вы можете просто наследовать от ActiveRecord::Generators::Base и все будет работать

...