Rails2 on Debian/etch
開発版を追いかけるのは疲れるので、安定版がリリースされるまで待ちます。Rails2もようやくいれてみました(*)。
etchでパッケージ化されているrailsは次のバージョンです。
$ dpkg -l|grep rails ii rails 1.1.6-3 MVC ruby based framework geared for web appl
これは古すぎるので、以前、/usr/local/ruby以下にrails1.2.5をインストールしていました。 その時の手順は次のようにしました。
# aptitude install rubygems # mkdir /usr/local/ruby # chown inoue:users /usr/local/ruby $ gem install rails -i /usr/local/ruby --include-dependencies
/usr/local/rubyの所有を自分にしてgemの実行をroot権限で行わない理由は、gem install がシステム領域(/usr/binの下など)を侵蝕することがあると嫌だからです。 次のように環境変数を設定しておくと、普通に使えます。
$ export GEM_PATH=/usr/local/ruby $ export PATH=${GEM_PATH}/bin:$PATH
/usr/local/ruby以下のrails1.xは残したまま、rails2.xをインストールすることにしました。ほぼ同じ方針で次のようにしました。
# mkdir /usr/local/ruby2 # chown inoue:users /usr/local/ruby2 $ gem install rails -i /usr/local/ruby2 --include-dependencies
環境変数(GEM_PATH)を切替えるだけで使えるはずです。railsの実行は問題なく動きました。が、script/generateで次のエラーがでました。
$ script/generate Rails requires RubyGems >= 0.9.4 (you have 0.9.0). Please `gem update --system` and try again.
etchのパッケージのgemのバージョンは次のようになっています。
$ dpkg -l|grep gems ii libgems-ruby1.8 0.9.0-5 libraries to use RubyGems, a package managem ii rubygems 0.9.0-5 package management framework for Ruby librar
etchをアップグレードする気はありません。エラーメッセージにある gem update --system の詳細は不明ですが、Debianでパッケージ管理されたgemを、独自にアップグレードするのは避けたいところです(パッケージ管理混ぜるな危険の法則による)。
結局、gemのソースを持ってきて、自分でインストールすることにしました(/usr/local/ruby2の下にインストール)。
$ cd rubygems-1.0.1 $ ruby setup.rb --prefix=/usr/local/ruby2
環境変数の設定は次のようにします。
$ export RUBYLIB=/usr/local/ruby2/lib $ export GEM_PATH=/usr/local/ruby2 $ export PATH=${GEM_PATH}/bin:$PATH
これでscript/generateが動くようになりました。
と思ったら、なんと今度はrailsが動かなくなりました。
$ rails /usr/local/ruby2/bin/rails:17: undefined method `require_gem' for main:Object (NoMethodError)
require_gemがgem1.xで無くなっているのが原因です。APIを勝手に変えるgemに問題があるのか、gem1.xで無くなるAPIに依存しているrailsに問題があるのか、それはともかく微妙な混沌ぶりに脱力します。
結局、gemにこだわりもないので、rubygems-0.9.5にダウングレードしました。次のような警告はでますが、無視します。
$ rails /usr/local/ruby2/bin/rails:17:Warning: require_gem is obsolete. Use gem instead.
rails2を少しいじってみました。script/scaffoldで作られるコントローラのコードがこんなです。
def index @my_models = MyModel.find(:all) respond_to do |format| format.html # index.html.erb format.xml { render :xml => @my_models } end end
いきなりムズいです。Rubyを知らない人が見たら、ファイル名が並んでいると間違えそうです。ちなみにrespond_toのコードも、冒頭からいきなり
def respond_to(*types, &block) raise ArgumentError, "respond_to takes either types or a block, never both" unless types.any? ^ block
respond_toをブロック付きで呼び出すと、仮引数の &block に値が入るので、blockの評価がtrueになります。ブロック以外の引数を渡すと、*types に値が入ります(アスタリスクの意味は、可変長引数を配列で受ける、です)。この時、types.any? はtrueになります。unless以下は XOR をしているので、両方falseもしくは両方trueの場合に例外を投げます。
respond_to の動作もなかなかエキセントリックです(format.htmlの呼び出しで成功した時、format.xmlが呼ばれない処理の流れは、ソースを見ても良く分かりません)。
絶対、RubyはJavaより難しいと思います。
(*) あまり保守的すぎるのも問題かと思い、せめてemacsぐらいはと、CVSの最新版ソースを手元に持っています。最近はDBus周りのコードのコミットが目につきます。もっとも常用しているemacsはいまだにemacs21ですが...
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/rails2-first/tbping