5

Насколько сложно преобразовать рельсы 2 генератора в рельсы 3? Я продолжаю находить полезные плагины, но затем обнаруживаю, что генераторы предназначены только для рельсов 2. Я понимаю, что некоторые из них просто удобны, но если перенастройка генератора на рельсы 3 так же просто, как настройка нескольких строк в коде генератора, я бы не забудьте сделать это (и поручите работу github для будущих пользователей).Преобразование рельсов 2 генератора в рельсы 3?

Вот один такой генератор Я думал об использовании, например (от 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

У меня такой же вопрос. Я хочу использовать wizardly, но исходный исходный код соответствует только Rails 2. Затем я нашел того, кто создал ветку Rails 3 (https://github.com/jfelchner/wizardly), но генератор все еще находится в Rails 2. –

+0

Они совсем разные ... Существует вилка Rails-3 для обратной связи, кстати: https://github.com/alkesh/feedback – Roman

ответ

4

Это действительно зависит от вида генератора это. Множество внутренних элементов Rails сильно изменилось между 2 и 3. Позвольте мне показать вам недавний опыт преобразования очень простого генератора миграции, который у меня есть в одном из моих приложений от 2 до 3.

Вот 2 код:

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

И вот 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 

Итак, как вы можете видеть - совершенно другой метод, чтобы переопределить, должен был унаследовать от генератора теперь, должен был назвать эту source_root сейчас (используется автоматически), и больше не называет migration_template в блоке.

Это небольшое преобразование заняло у меня около трех часов, чтобы выследить все части через источник. Лучшая часть была в том, что мне не пришлось менять свой шаблон вообще (и я считаю, что это будет верно для большинства генераторов).

Все, что я говорю, я думаю, что миграция, вероятно, наименее хорошо документирована, это действительно не слишком сложно воссоздать генераторы в Rails3. На мой взгляд, определенно стоит взломать.

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

+0

Спасибо. Я немного поработал над этой темой, посмотрел на другие генераторы Rails 3 и нашел почти все, что мне нужно. Единственное, что я не мог понять, - это передать переменную шаблону в генераторы Rails 3, что было легко сделано с помощью хэш-значения ': assigns' в генераторах Rails 2. –

Смежные вопросы