Rails 2.0 ファーストインプレッション
Rails 1.2 系をほとんど使わないうちに、 Rails 2.0 が出た。 1.2 系は WEB+DB PRESS の記事を読んで REST 志向になった (scaffold_resource とか) ということを知ってたくらいで実際に試してみたことは無かった。 Rails 2.0 で、 scaffold_resource が標準になったってことで、ちょっと試してみた。
scaffold で作られるソースを比較してみる。
scaffold の実行
Rails1.2 のときは model とデータベースを作って、そのあとに scaffold を作るようになっていた。
$ ./script/generate model item body:text $ rake db:migrate $ ./script/generate scaffold item
Rails2.0だと、いきなり scaffold でOK。モデルもデータベースのスキーマも作ってくれる。
$ ./script/generate scaffold item body:text
scaffold が生成したコードを使っていて気がつくのは URL が変わったこと。これまでは
http://localhost:3000/items/edit/1
だったのが、
http://localhost:3000/items/1/edit
になった。 今までは「コントローラ名 + 動詞 (アクション名) + 目的語 (対象モデルのID)」だったのが、「コントローラ名+目的語+動詞」になった。
ビューでも form_for というメソッドが使われるようになってる。
<% form_for(@item) do |f| %> <p> <b>Body</b><br /> <%= f.text_area :body %> </p> <p> <%= f.submit "Update" %> </p> <% end %>
あれ…フォームに入力した値の送信先が書いてない。
Rails1.2だと、
http://localhost:3000/items/update/1
みたいに update アクションを呼び出していた。 Rails2.0だと、
http://localhost:3000/items/1
に対して POST することで、自動的に update アクションが呼ばれるみたい。 うーん。 REST 志向だ(本来は POST じゃなくて PUT だけど、そこはいろいろと)。
class ItemsController < ApplicationController # PUT /items/1 # PUT /items/1.xml def update @item = Item.find(params[:id]) respond_to do |format| if @item.update_attributes(params[:item]) (以下略)
印象
REST 志向になって分かりやすくなった反面、ブラックボックスも増えたな…というところ。 例えば、ビューで form_for と書くと、なんで update アクションが呼ばれるのかが分からない。 たぶん、 routes.rb にて
map.resources :items
って書いてあるからなんだろうけど、 map.resources の中身が分からないとなんとも。 趣味で使う分には好きだけど、仕事で使うとなると、ちゃんと仕組みを理解してからじゃないと、ちょっと怖いかも。