2010-11-10 19 views
8

Estoy simplemente tratando de crear un generador de migración de plugins sin ningún parámetro, como: $rails generate yaffle y esto debería copiar el archivo de migración (lib/generators/yaffle/template/create_yaffle.rb) para db/migrate/[timestamp] _create_yaffle.rb.generadores y migraciones en complementos (rieles 3)

  1. El problema al que me enfrento aquí es su copia, pero sin indicación de fecha y hora.
  2. Además, cuando ejecuto $rails generate yaffle me da un mensaje de que no se proporcionan argumentos, se espera que esté en este formato rails generate yaffle NAME [options]. No quiero tener ninguna opción/argumento, solo debería ser rails generate yaffle.

¿Qué debo hacer?

Seguí el generador utilizado en acts_as_commentable, parece bastante simple, pero no sé dónde modificar estos ajustes ... ¿Alguien puede ayudar?

generador de código:

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

¿Es posible vincular su plugin para que podamos probarlo? – rwilliams

+0

hey, lo descubrí (mira la respuesta) ... he actualizado la publicación con mi código de generador ... – Madhusudhan

Respuesta

21

Bueno, he encontrado la respuesta ...

  1. que estaba usando en lugar de Rails::Generators::NamedBaseRails::Generators::Base en mi archivo generador! Cuando se utiliza NamedBase, que siempre espera un argumento que se pasa (que es el nombre de inicializador)

    Explicación: guides.rubyonrails.org/generators

  2. Y yo estaba usando template método en lugar de migration_template debido a lo cual los archivos de migración di no producir cualquier número de migración

    Explicación: Rails::Generators::Migration.migration_template

Así que, finalmente, esto funcionó!

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

Cuando hago esto con migraciones múltiples y ejecuto rake db: migrate obtengo: Múltiples migraciones tienen la versión número 20110413160337, que tiene sentido porque ambas migraciones se crean con la misma marca de tiempo. ¿Te encontraste con esto? –

+2

@Mike Farmer: Agregue '% 6N' a la cadena de formato strftime para obtener los microsegundos y debería estar listo para continuar. De esta manera: https://gist.github.com/1110373 – davemyron

+4

Puede 'requerir 'rails/generators/active_record'' y luego usar' ActiveRecord :: Generators :: Base.next_migration_number (path) 'for next_migration_number – NARKOZ

1

simplemente puede heredar de ActiveRecord::Generators::Base y todo va a trabajar

2

Un pequeño polaco en la solución - a ahorrarse la molestia de definir la fecha y hora para la migración y prueba de futuro de su generador en caso Rails equipo central decide utilizar otra forma de estampado (por ejemplo, SHA hash truncado a 10 caracteres), puede require 'rails/generators/active_record' y extend ActiveRecord::Generators::Migration como esto:

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 

de actualización en los carriles 4 ActiveRecord::Generators::Migration ya no es un módulo, entonces use en su lugar:

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 
Cuestiones relacionadas