Personal tools
You are here: Home ブログ 井上 Rails2 on Debian/etch
« December 2010 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Recent entries
Apache2.4のリリース予定は来年(2011年)初め(あくまで予定) inoue 2010-12-23
Herokuの発音 inoue 2010-12-20
雑誌記事「ソフトウェア・テストPRESS Vol.9」の原稿公開 inoue 2010-12-18
IPA未踏のニュース inoue 2010-12-15
労基法とチキンゲーム inoue 2010-12-06
フロントエンドエンジニア inoue 2010-12-03
ASCII.technologies誌にMapReduceの記事を書きました inoue 2010-11-25
技術評論社パーフェクトシリーズ絶賛発売中 inoue 2010-11-24
雑誌連載「Emacsのトラノマキ」の原稿(part8)公開 inoue 2010-11-22
RESTの当惑 inoue 2010-11-22
「プログラマのためのUXチートシート」を作りました inoue 2010-11-19
「ビューティフルコード」を読みました inoue 2010-11-16
Categories
カテゴリなし
 
Document Actions

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ですが...

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/rails2-first/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.