Rails2.0から2.1への移行を試してみる

ここ最近、MacBookの作業環境改善に努めている間に、Railsは2.1にバージョンアップしていた。相変わらずの進化のスピード。すでに出遅れた感はあるが、自分のRails環境も2.1にしてみた。Railsの複数バージョン環境は共存できることが分かっているので結構気軽に。でも、2.1環境でちゃんと稼働させるまでには、それなりの試練が待っていた。

gemでアップデート

視野の狭い自分は、いきなりgem update railsとやってしまったが、これではちゃんとアップデートされなかった。まずはgem自体のアップデートが必要なことが多いのであった...。(以前の日記Rails2.0.2を使ってみるにも書いていたのに、すっかり忘れている。)もう一度仕切り直しで、以下のようにしてみた。

  • gemのバージョンが1.0.1から1.1.1に上がった。
$ sudo gem update --system
Updating RubyGems...
Bulk updating Gem source index for: http://gems.rubyforge.org
Updating metadata for 13 gems from http://gems.rubyonrails.org
.............
complete
Attempting remote update of rubygems-update
Successfully installed rubygems-update-1.1.1
1 gem installed
Updating version of RubyGems to 1.1.1
Installing RubyGems 1.1.1
  • その後、Railsのバージョンアップを実行した。
$ sudo gem update rails
Password:
Updating installed gems
...(中略)...
complete
Successfully installed activesupport-2.1.0
Successfully installed activerecord-2.1.0
Successfully installed actionpack-2.1.0
Successfully installed actionmailer-2.1.0
Successfully installed activeresource-2.1.0
Successfully installed rails-2.1.0
Gems updated: activesupport, activerecord, actionpack, actionmailer, activeresource, rails

railsプロジェクトのアップデート

Rails2.0.2からのサンプルプロジェクトをコピーして、以下のようにやってみた。

  • environment.rbのRAILS_GEM_VERSIONを「2.0.2」から「2.1.0」に変更した。
#---------- config/environment.rb ----------
...(中略)...
# Specifies gem version of Rails to use when vendor/rails is not present
RAILS_GEM_VERSION = '2.1.0' unless defined? RAILS_GEM_VERSION
...(中略)...
  • rakeによるプロジェクトの基本設定アップデート
$ rake rails:update
  • 以下のファイルが最新のRails用に更新されるようだ。
    • config/boot.rb
    • public/javascriptsフォルダのファイル
    • scriptフォルダのファイル

サーバーが起動するまで

以上の設定をしてscript/serverをやってみるが、すんなり起動するはずはないか...。以下のようなエラーで怒られて、Mongrelサーバーは起動せず...。

config.action_view.cache_template_extensions
  • config/environments/development.rbの「config.action_view.cache_template_extensions= false」オプションは推奨されなくなり、何の影響も与えないらしい...。削除してくださいと警告されているので、削除してしまった。(警告なので削除しなくてもサーバーは起動する。)
DEPRECATION WARNING: config.action_view.cache_template_extensions option has been deprecated and has no affect. Please remove it from your config files.  See http://www.rubyonrails.org/deprecation for details. (called from send at /Library/Ruby/Gems/1.8/gems/rails-2.1.0/lib/initializer.rb:455)
amrita2
  • どうやらamrita2でエラーが発生しているようだ。
"78756"
=> Booting Mongrel (use 'script/server webrick' to force WEBrick)
=> Rails 2.1.0 application starting on http://127.0.0.1:3005
=> Call with -d to detach
=> Ctrl-C to shutdown server
** Starting Mongrel listening at 127.0.0.1:3005
** Starting Rails with development environment...
Exiting
/Users/bebe/Documents/Aptana Studio/test_slip202_210/vendor/plugins/amrita2-2.0.2/init.rb:5:in `evaluate_init_rb': undefined method `register_template_handler' for ActionView::Base:Class (NoMethodError)
	from /Library/Ruby/Gems/1.8/gems/rails-2.1.0/lib/rails/plugin.rb:95:in `evaluate_init_rb'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/core_ext/kernel/reporting.rb:11:in `silence_warnings'
	from /Library/Ruby/Gems/1.8/gems/rails-2.1.0/lib/rails/plugin.rb:91:in `evaluate_init_rb'
	from /Library/Ruby/Gems/1.8/gems/rails-2.1.0/lib/rails/plugin.rb:44:in `load'
	from /Library/Ruby/Gems/1.8/gems/rails-2.1.0/lib/rails/plugin/loader.rb:33:in `load_plugins'
	from /Library/Ruby/Gems/1.8/gems/rails-2.1.0/lib/rails/plugin/loader.rb:32:in `each'
	from /Library/Ruby/Gems/1.8/gems/rails-2.1.0/lib/rails/plugin/loader.rb:32:in `load_plugins'
	from /Library/Ruby/Gems/1.8/gems/rails-2.1.0/lib/initializer.rb:283:in `load_plugins'
	 ... 32 levels...
	from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:27:in `require'
	from ./script/server:3
	from -e:2:in `load'
	from -e:2
  • Rails2.1以降のアップデートはないようなので、とりあえずamrita2フォルダをPluginsフォルダの外に出してみた。
  • config/environment.rbでのamrita2関連の設定もコメントアウトしておいた。
  • 現状「.a2」と「.html.erb」両形式のファイルが残っているので、プラグインから外れれば、優先してRails標準の「.html.erb」を使って描画されるようになった。

gettext
  • ruby-gettextでもエラーが発生している模様。
"27870"
=> Booting Mongrel (use 'script/server webrick' to force WEBrick)
=> Rails 2.1.0 application starting on http://127.0.0.1:3003
=> Call with -d to detach
=> Ctrl-C to shutdown server
** Starting Mongrel listening at 127.0.0.1:3003
** Starting Rails with development environment...
Exiting
/Users/bebe/Documents/Aptana Studio/test_slip210/app/controllers/application.rb:11: undefined method `init_gettext' for ApplicationController:Class (NoMethodError)
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:215:in `load_without_new_constant_marking'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:215:in `load_file'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:354:in `new_constants_in'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:214:in `load_file'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:95:in `require_or_load'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:60:in `depend_on'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:456:in `require_dependency'
	from /Library/Ruby/Gems/1.8/gems/actionpack-2.1.0/lib/action_controller/dispatcher.rb:18:in `define_dispatcher_callbacks'
	 ... 42 levels...
	from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:27:in `require'
	from ./script/server:3
	from -e:2:in `load'
	from -e:2
  • 最新のバージョン1.91.0にしてみたが、やはりエラーが発生している。
  • 対策はrails2.0.2 → 2.1.0 に移行 - 夜の Discoveryさんのページに載っていた。(感謝です!)
  • /config/initializers/gettext.rbを追加して、「require 'gettext/rails'」を含めて以下のように設定した。
require 'gettext/rails'
module ActionView
  class Base
    delegate :file_exists?, :to => :finder unless respond_to?(:file_exists?)
  end
end
  • config/environment.rbでの「require 'gettext/rails'」は削除した。


以上でサーバーは起動し、見た目上は正常に稼働している模様。


  • ruby-gettext 1.92.0では、シンプルに以下の設定でOKになった。
# ---------- config/environment.rb ----------
# 文字列処理で日本語を考慮した処理メソッドを利用可能にする。
# http://www.ruby-lang.org/ja/man/html/jcode.html
require 'jcode'

...(中略)...
Rails::Initializer.run do |config|
...(中略)...
  config.gem "gettext", :lib => "gettext/rails"
end

configフォルダ内の変化

その他にもconfigフォルダ内を以前と比較してみると、以下のような変化が起こっていた。(以下の設定はRails2.1プロジェクトとして始めれば最初から設定されていることだが、Rails2.0.2からバージョンアップした現状は設定されていない状態。それでも見た目上は正常に稼働している。)

  • config/initializers/new_rails_defaults.rbが追加された。(Rails3の準備?)
# These settings change the behavior of Rails 2 apps and will be defaults
# for Rails 3. You can remove this initializer when Rails 3 is released.

# Include Active Record class name as root for JSON serialized output.
ActiveRecord::Base.include_root_in_json = true

# Store the full class name (including module namespace) in STI type column.
ActiveRecord::Base.store_full_sti_class = true

# Use ISO 8601 format for JSON serialized times and dates.
ActiveSupport.use_standard_json_time_format = true

# Don't escape HTML entities in JSON, leave that for the #json_escape helper.
# if you're including raw json in an HTML page.
ActiveSupport.escape_html_entities_in_json = false
  • Railsプロジェクト生成直後のenvironment.rbの変化(以下の設定が追加されたようだ。)
--- /rails202/config/environment.rb	2008-06-21 14:55:29.000000000 +0900
+++ /rails210/config/environment.rb	2008-06-21 15:15:06.000000000 +0900

   # 自分が変更したバージョン番号
   # Specifies gem version of Rails to use when vendor/rails is not present
-RAILS_GEM_VERSION = '2.0.2' unless defined? RAILS_GEM_VERSION
+RAILS_GEM_VERSION = '2.1.0' unless defined? RAILS_GEM_VERSION

   # このアプリケーションに依存するgemを指定することができるようだ。
   # ここで指定したgemは「rake gems:install」でインストールできるらしい。
+  # Specify gems that this application depends on. 
+  # They can then be installed with "rake gems:install" on new installations.
+  # config.gem "bj"
+  # config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
+  # config.gem "aws-s3", :lib => "aws/s3"
 
   # 新たに追加されたタイムゾーンの指定
+  # Make Time.zone default to the specified zone, and make Active Record store time values
+  # in the database in UTC, and return them converted to the specified local zone.
+  # Run "rake -D time" for a list of tasks for finding time zone names. Uncomment to use default local time.
+  config.time_zone = 'UTC'

   # 以前のタイムゾーンの設定部分は削除されていた
-  # Make Active Record use UTC-base instead of local time
-  # config.active_record.default_timezone = :utc

その他

  • render :partialカウンターの挙動が変わっていた。(「パーシャルファイル名_counter」という命名規約によるカウンター変数の挙動)
    • Rails 2.0.2までは0から始まるインデックス値(0, 1, 2, 3...)
    • Rails 2.1.0からは1から始まるインデックス値(1, 2, 3, 4...)
      • 個人的には嬉しい挙動変更だけど、変更された記述が見つけられなくて、これに気付くまで悩んでしまった...。

参考ページ

所感

  • Railsのバージョン0.1の違いは何らかの試練あり。(0.0.1の違いならおそらく試練無し)