raill2.2.2へ更新

railsの2.0.2でアプリケーションを作っていましたが、今回2.2.2へアップグレードしてみました。
環境はMacBookPro上のMacOSX10.5です。

gemでrailsをインストール

とりあえず、あまり考えずの「gem update rails」とインストールしてみました。

それから,アプリケーションのconfig/environments.rbのバージョン指定を変更。

 RAILS_GEM_VERSION = '2.2.2' unless defined? RAILS_GEM_VERSION

この結果、やっぱりすんなり動作はせず、以下のようにいろいろと格闘する結果となってしまいました。

「cache_template_extensions=」の設定解除

mongrelを起動すると以下のエラーが出る。

/Library/Ruby/Gems/1.8/gems/rails-2.2.2/lib/initializer.rb:530:in `send': undefined method `cache_template_extensions=' for ActionView::Base:Class (NoMethodError)
	from /Library/Ruby/Gems/1.8/gems/rails-2.2.2/lib/initializer.rb:530:in `initialize_framework_settings'
	from /Library/Ruby/Gems/1.8/gems/rails-2.2.2/lib/initializer.rb:529:in `each'
	from /Library/Ruby/Gems/1.8/gems/rails-2.2.2/lib/initializer.rb:529:in `initialize_framework_settings'
	from /Library/Ruby/Gems/1.8/gems/rails-2.2.2/lib/initializer.rb:526:in `each'
	from /Library/Ruby/Gems/1.8/gems/rails-2.2.2/lib/initializer.rb:526:in `initialize_framework_settings'
	from /Library/Ruby/Gems/1.8/gems/rails-2.2.2/lib/initializer.rb:154:in `process'
	from /Library/Ruby/Gems/1.8/gems/rails-2.2.2/lib/initializer.rb:112:in `send'
	from /Library/Ruby/Gems/1.8/gems/rails-2.2.2/lib/initializer.rb:112:in `run'
	 ... 12 levels...
	from /Library/Ruby/Gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/command.rb:212:in `run'
	from /Library/Ruby/Gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281
	from /usr/bin/mongrel_rails:19:in `load'
	from /usr/bin/mongrel_rails:19

「config/environments/development.rb」
から「cache_template_extensions」に関する指定を削除しました。
cache_template_extensionsの機能自体が2.2.2からは削除されたということのようですね。

# config.action_view.cache_template_extensions          = false

gettext.rbを無効にする。

さらに、mongrelを起動すると以下のようなエラーとなりました。

/Users/nyaago/workspace/cart/app/controllers/application.rb:7: undefined method `init_gettext' for ApplicationController:Class (NoMethodError)
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:382:in `load_without_new_constant_marking'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:382:in `load_file'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:521:in `new_constants_in'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:381:in `load_file'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:256:in `require_or_load'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:221:in `depend_on'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:133:in `require_dependency'
	from /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/dispatcher.rb:18:in `define_dispatcher_callbacks'
	 ... 25 levels...
	from /Library/Ruby/Gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/command.rb:212:in `run'
	from /Library/Ruby/Gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281
	from /usr/bin/mongrel_rails:19:in `load'
	from /usr/bin/mongrel_rails:19

2.1へ移行された方の記事を参照にして対応を行いました。

config/initializers/gettext.rbというファイルを追加して、以下のように記述。
  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'」は削除。

これで、再度mongrelを起動
こんどは、以下のようなエラーとなる。

/Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/core_ext/module/aliasing.rb:33:in `alias_method': undefined method `render_file' for class `ActionView::Base' (NameError)
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/core_ext/module/aliasing.rb:33:in `alias_method_chain'
	from /Library/Ruby/Gems/1.8/gems/gettext-1.93.0/lib/gettext/rails.rb:291
	from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
	from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:36:in `require'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:153:in `require'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:521:in `new_constants_in'
	from /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:153:in `require'
	from /Users/nyaago/workspace/cart/config/initializers/gettext.rb:1
	 ... 22 levels...
	from /Library/Ruby/Gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/command.rb:212:in `run'
	from /Library/Ruby/Gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281
	from /usr/bin/mongrel_rails:19:in `load'
	from /usr/bin/mongrel_rails:19

それから調べると、2.2.2ではgettextを使わなくてもi18n(国際化)が標準装備かつruby-getTextがRails2.2.2に非対応ぽいので、gettextを使わないといことで起動修正。

上で作成した「config/initializers/gettext.rb」を削除。
コントローラー中の「init_gettext」の記述を削除

mysqlドライバインストール

これで、再度mongrelを起動。
今回は起動まではするが、mysqlに接続するところで以下のようにエラーが発生。

!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql.

そこで、mysqlドライバをインストール。
まず、gemでのインストールを試みる。

sudo gem install mysql
Password:
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
	ERROR: Failed to build gem native extension.

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb install mysql
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... no
checking for mysql_query() in -lmysqlclient... no

だめだったので、手動インストールを行う。mysql_configの場所を指定してコンフィギュを実行してメイクしてみます。

$cd /Library/Ruby/Gems/1.8/gems/mysql-2.7
$sudo ruby extconf.rb --with-mysql-config=/usr/local/mysql-client/bin/mysql_config
$sudo make

この結果、以下のようにリンクエラーが発生。

gcc -I. -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0 -I. -DHAVE_MYSQL_H  -I/usr/local/include/mysql -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT  -DDONT_DECLARE_CXA_PURE_VIRTUAL -fno-common -arch ppc -arch i386 -Os -pipe -fno-common  -c mysql.c
cc -arch ppc -arch i386 -pipe -bundle -undefined dynamic_lookup -o mysql.bundle mysql.o -L"." -L"/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib" -L. -arch ppc -arch i386    -lruby -L/usr/local/mysql-client/lib/mysql -lmysqlclient -lz -lm  -lpthread -ldl -lm  
ld: warning in /usr/local/mysql-client/lib/mysql/libmysqlclient.dylib, file is not of required architecture

mysqlintelプロセッサーのみのアーキテクチャーなのにppcとintelのUniversalバイナリを生成しようとしたからでした。
で、Makefileを以下のとおりi386だけの構築をするよういじりました。

#CFLAGS   =  -fno-common -arch ppc -arch i386 -Os -pipe -fno-common                                            
CFLAGS   =  -fno-common  -arch i386 -Os -pipe -fno-common
...
#DLDFLAGS = -L. -arch ppc -arch i386                                                                           
DLDFLAGS = -L.  -arch i386
...
#LDSHARED = cc -arch ppc -arch i386 -pipe -bundle -undefined dynamic_lookup                                    
LDSHARED = cc  -arch i386 -pipe -bundle -undefined dynamic_lookup

これで再度、Makeします。

$sudo make clean
$sudo make
$sudo make install

これでmongrelを再起動して、アプリケーションを操作してみると、
とりあえず動いているよう。。。

基本設定の更新

これもやっておこないと。。。。

$rake rails:update