at posts/single.html

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 の中身が分からないとなんとも。 趣味で使う分には好きだけど、仕事で使うとなると、ちゃんと仕組みを理解してからじゃないと、ちょっと怖いかも。

関連する日記