2010-11-10 3 views
8

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

  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 
+0

Можно ли связать ваш плагин, чтобы мы могли его протестировать? – rwilliams

+0

эй, я понял это (посмотри на ответ) ... я обновил сообщение своим кодом генератора ... – Madhusudhan

ответ

21

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

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

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

  2. И я использовал метод template вместо migration_template из-за миграционные файлы din't производить любое количество миграции

    Объяснение: 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 
+0

Когда я делаю это с несколькими миграциями и запускаю rake db: migrate Я получаю: У нескольких миграций есть версия номер 20110413160337, что имеет смысл, поскольку обе миграции создаются с одинаковой меткой времени. Вы столкнулись с этим? –

+2

@Mike Farmer: добавьте '% 6N' в строку формата strftime, чтобы получить микросекунды, и вам должно быть хорошо идти. Например: https://gist.github.com/1110373 – davemyron

+4

Вы можете «потребовать« рельсы/генераторы/active_record'', а затем использовать «ActiveRecord :: Generators :: Base».next_migration_number (path) 'для next_migration_number – NARKOZ

1

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

2

Небольшой польский на решение - спасти себя от хлопот определения метки времени для перехода на будущее и ваш генератор в случае 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 

ОБНОВЛЕНИЯ в рельсах 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 
Смежные вопросы