5

¿Cuán difícil es convertir los raíles 2 generadores en raíles 3? Sigo encontrando plugins útiles pero luego descubro que los generadores son solo para raíles 2. Me doy cuenta de que parte de esto es solo una conveniencia, pero si migrar el generador a los raíles 3 es tan simple como ajustar algunas líneas en el código del generador, lo haría estar solo para hacer eso (y comprometer el trabajo con github para futuros usuarios también).Convierte los carriles de 2 generadores a los rieles 3?

Aquí hay uno como generador He estado pensando acerca del uso de, por ejemplo (de feedback)

require File.expand_path(File.dirname(__FILE__) + "/lib/insert_routes.rb") 

class FeedbackFormGenerator < Rails::Generator::Base 

    attr_accessor :name, 
    :model_class_name, 
    :controller_class_name, 
    :helper_class_name, 
    :mailer_class_name 


    def initialize(runtime_args, runtime_options = {}) 
    super 
    @name = (runtime_args[0] || "feedback").downcase 
    @model_class_name = name.classify 
    @mailer_class_name = "#{@model_class_name}Mailer" 
    @controller_class_name = "#{@model_class_name.pluralize}Controller" 
    @helper_class_name = "#{@model_class_name.pluralize}Helper" 
    #@js_framework = (runtime_options['']) 

    end 

    def manifest 
    record do |m| 

     puts "hello" 
     add_model(m) 
     add_mailer(m) 
     add_controller(m) 
     add_helper(m) 
     add_views(m) 
     add_routes(m) 
     add_unit_test(m) 
     add_functional_test(m) 
     add_stylesheet(m) 
     add_javascript(m) 
     add_images(m) 
    end 
    end 


    def add_stylesheet(m) 
    m.directory 'public/stylesheets' 
    m.file 'feedback.css', 'public/stylesheets/feedback.css' 

    end 

    def add_javascript(m) 
    m.directory 'public/javascripts' 
    file_name = options[:jquery] ? 'jquery.feedback.js' : 'prototype.feedback.js' 
    m.file file_name, "public/javascripts/#{file_name}" 
    end 

    def add_images(m) 
    m.directory 'public/images/feedback' 
    m.file "images/feedback_tab.png", "public/images/feedback/feedback_tab.png" 
    m.file "images/feedback_tab_h.png", "public/images/feedback/feedback_tab_h.png" 
    m.file "images/closelabel.gif", "public/images/feedback/closelabel.gif" 
    m.file "images/loading.gif", "public/images/feedback/loading.gif" 
    end 

    def add_model(m) 
    m.template 'feedback_model.rb.erb', "app/models/#{name}.rb" 
    end 

    def add_mailer(m) 
    m.template 'feedback_mailer.rb.erb', "app/models/#{name}_mailer.rb" 
    m.directory "app/views/#{name}_mailer" 
    m.file 'views/feedback_mailer/feedback.html.erb', "app/views/#{name}_mailer/feedback.html.erb" 

    end 

    def add_controller(m) 
    m.template 'feedbacks_controller.rb.erb', "app/controllers/#{name.pluralize}_controller.rb" 
    end 

    def add_helper(m) 
    template_name = options[:jquery] ? 'feedbacks_helper.rb.jquery.erb' : 'feedbacks_helper.rb.prototype.erb' 
    m.template template_name, "app/helpers/#{name.pluralize}_helper.rb" 
    end 

    def add_views(m) 
    m.directory "app/views/#{name.pluralize}" 
    m.file 'views/feedbacks/new.html.erb', "app/views/#{name.pluralize}/new.html.erb" 
    end 

    def add_routes(m) 
    m.route_name "new_feedback", "feedbacks/new", {:controller => name.pluralize, :action => "new"} 
    m.route_name "feedback", "feedbacks", {:controller => name.pluralize, :action => "create"} 
    end 

    def add_unit_test(m) 
    m.template 'feedback_test.rb.erb', "test/unit/#{name}_test.rb" 
    m.template 'feedback_mailer_test.rb.erb', "test/unit/#{name}_mailer_test.rb" 
    end 

    def add_functional_test(m) 
    m.template 'feedbacks_controller_test.rb.erb', "test/functional/#{name.pluralize}_controller_test.rb"  
    end 

    protected 

    def add_options!(opt) 
    opt.separator '' 
    opt.separator 'Options:' 
    opt.on("--jquery", 
     "Use jquery Javascript framework, default is Prototyp")   { |v| options[:jquery] = true } 
    end 
end 
+0

Tengo la misma pregunta. Quiero usar wizardly, pero la fuente original solo es compatible con Rails 2. Luego encontré a alguien que hizo una sucursal de Rails 3 (https://github.com/jfelchner/wizardly), pero el generador todavía está en el código de Rails 2. –

+0

Son muy diferentes ... Existe una horquilla Rails-3 para comentarios, por cierto: https://github.com/alkesh/feedback – Roman

Respuesta

4

Realmente depende del tipo de generador que es. Muchos de los aspectos internos de Rails han cambiado mucho entre 2 y 3. Permítanme mostrarles mi experiencia reciente en la conversión de un generador de migración muy simple que tengo en una de mis aplicaciones del 2 al 3.

Aquí está la 2 código:

class LegacyMigrationGenerator < MigrationGenerator 
    def manifest 
    record do |m| 
     m.migration_template 'legacy_migration.rb', 'db/migrate' 
    end 
    end 
end 

Y aquí está el código 3:

require 'rails/generators/active_record' 

class LegacyMigrationGenerator < ActiveRecord::Generators::Base 
    source_root File.expand_path('../templates', __FILE__) 
    def create_migration_file 
    migration_template "legacy_migration.rb", "db/migrate/#{file_name}.rb" 
    end 
end 

Por lo tanto, como se puede ver - totalmente diferente método para anular, tuvo que heredar de un generador de ahora, tuvo que llamar a este source_root ahora (solía ser automático) y ya no llama al migration_template en un bloque.

Esta pequeña conversión me llevó aproximadamente tres horas para buscar todas las piezas a través de la fuente. La mejor parte fue que no tuve que cambiar mi plantilla (y creo que eso será cierto para la mayoría de los generadores).

Dicho todo esto, creo que la generación de migración es probablemente la menos documentada, looking at the generator guide realmente no parece demasiado difícil para recrear generadores en Rails3. Definitivamente vale la pena intentarlo en mi opinión.

Además, sé que uno de los autores de esa guía tiene un libro que saldrá pronto con un capítulo sobre generadores, por lo que definitivamente es algo que recibirá más atención.

+0

Gracias. Hice un poco más de investigación sobre el tema, mirando otros generadores de Rails 3, y encontré casi todo lo que necesitaba. Lo único que no pude descifrar fue cómo pasar una variable a una plantilla en los generadores de Rails 3, lo que se hizo fácilmente con un valor hash ': assigns' en los generadores Rails 2. –

Cuestiones relacionadas