Rails 2.0 ファーストインプレッション
2007-12-22
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 の中身が分からないとなんとも。 趣味で使う分には好きだけど、仕事で使うとなると、ちゃんと仕組みを理解してからじゃないと、ちょっと怖いかも。