2010-11-10 4 views
8

J'essaye simplement de créer un générateur de migration de plugin sans aucun paramètre, comme: $rails generate yaffle et ceci devrait copier le fichier de migration (lib/generators/yaffle/template/create_yaffle.rb) vers db/migrate/[horodatage] _create_yaffle.rb.générateurs et migrations dans les plugins (rails 3)

  1. Le problème auquel je fais face ici est, sa copie, mais sans horodatage.
  2. Aussi, quand je cours $rails generate yaffle il me donne un message que les arguments ne sont pas fournis, il s'attend à être dans ce format rails generate yaffle NAME [options]. Je ne veux pas avoir d'options/arguments, il devrait juste être rails generate yaffle.

Que dois-je faire?

J'ai suivi le générateur utilisé dans acts_as_commentable, il semble assez simple, mais je ne sais pas où modifier ces paramètres ... quelqu'un peut-il aider?

Code Generator:

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

Il est possible de lier votre plugin pour pouvoir le tester? – rwilliams

+0

hey, je l'ai compris (regardez la réponse) ... J'ai mis à jour le poste avec mon code générateur ... – Madhusudhan

Répondre

21

Ok, je l'ai trouvé la réponse ...

  1. j'utilisais Rails::Generators::NamedBase au lieu de Rails::Generators::Base dans mon dossier de générateur! Lorsque vous utilisez NamedBase, il attend toujours un argument à transmettre (ce qui est le nom de initialiseur)

    Explication: guides.rubyonrails.org/generators

  2. Et j'utilisait la méthode template au lieu de migration_template en raison de laquelle les fichiers de migration din't produire un numéro de migration

    Explication: Rails::Generators::Migration.migration_template

donc finalement, cela a fonctionné!

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

Quand je fais cela avec plusieurs migrations et exécutez rake db: migrate je reçois: Plusieurs migrations ont la version numéro 20110413160337, ce qui est logique car les deux migrations sont créées avec le même horodatage. Avez-vous couru à travers cela? –

+2

@Mike Farmer: Ajoutez '% 6N' à la chaîne de format strftime pour obtenir les microsecondes et vous devriez être prêt à partir. Comme ceci: https://gist.github.com/1110373 – davemyron

+4

Vous pouvez 'require 'rails/generators/active_record'' et ensuite utiliser' ActiveRecord :: Generators :: Base.next_migration_number (chemin) 'pour next_migration_number – NARKOZ

1

vous pouvez simplement hériter de ActiveRecord::Generators::Base et tout fonctionnera

2

Un petit vernis sur la solution - pour vous épargner les tracas de définir l'horodatage pour la migration et la preuve future de votre générateur en cas Rails équipe de base décide d'utiliser un autre moyen de marquage (par exemple SHA hash tronqués à 10 caractères), vous pouvez require 'rails/generators/active_record' et extend ActiveRecord::Generators::Migration comme ceci:

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 

MISE à JOUR Dans Rails 4 ActiveRecord::Generators::Migration n'est plus un module, utilisez plutôt:

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