5

Rails 2ジェネレーターをRails 3に変換するのはどれくらい難しいですか? 便利なプラグインを探し続けていますが、ジェネレーターは Rails 2 専用であることがわかりました。便利なものもあると思いますが、ジェネレーターを Rails 3 に移行するのがジェネレーター コードの数行を微調整するのと同じくらい簡単な場合は、それをするだけです(そして、将来のユーザーのためにもgithubに作業をコミットしてください)。

たとえば、これは私が使用することを考えていたそのようなジェネレーターの1つです(フィードバックから)

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
4

1 に答える 1

4

それは実際には、それがどのような種類のジェネレーターであるかによって異なります。Rails の内部の多くは、2 から 3 の間で大幅に変更されました。私のアプリの 1 つにある非常に単純な移​​行ジェネレーターを 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

この小さな変換で、ソースからすべての断片を探し出すのに約 3 時間かかりました。一番良かったのは、テンプレートをまったく変更する必要がなかったことです (これはほとんどのジェネレーターに当てはまると思います)。

そうは言っても、マイグレーション生成はおそらく最も文書化されていないと思います。ジェネレーターガイドを見ると、Rails3 でジェネレーターを再作成するのはそれほど難しくないようです。私の意見では、間違いなく試してみる価値があります。

また、そのガイドの著者の 1 人が、ジェネレーターに関するすべての章を含む本を間もなく出版することを知っています。

于 2011-04-21T15:48:31.683 に答える