[Ruby] Ruby on Rails 2.0 を試してみた
遅ればせながら、Ruby on Rails 2.0 を試してみました。
インストール
普通に gem update rails -y
scaffold
まずは、scaffold を・・・・ いきなりハマリました ^^);
% rails todo -d sqlite3 % cd todo % script/generate model todo due:date task:string % rake db:migrate % script/generate scaffold todo
1.2 では、上のように、カラムを指定しmodelを作成、 migrateでテーブル作成 、 scaffold でコントロール、ビューの作成という手順でしたが、 2.0 でこうすると scaffold で エラーが !!
検索したところ、 scaffold に カラムを指定が追加されたので、先にモデルを作成しなくても良くなりました。また、sqlite3 がデフォルトのDBになりました。
% rails todo % cd todo % script/generate scaffold todo due:date task:string % rake db:migrate
無事にアプリが出来たので、生成されたコードを見てみました。
db/migrate/001_create_todos.rb
create_table :todos do |t| t.date :due t.string :task t.timestamps end
t.timestamps とうのが追加されてます、これを書くと created_at, updated_at カラムが追加されるそうです。
% sqlite3 db/development.sqlite3 sqlite> .schema todos CREATE TABLE todos ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "due" date DEFAULT NULL, "task" varchar(255) DEFAULT NULL, "created_at" datetime DEFAULT NULL, "updated_at" datetime DEFAULT NULL);
たしかに、 created_at, updated_at カラムがあります。
model/todo.rb
1.2 と同じ
app/controllers/application.rb
使用するhelper の制御や、CSRF検出用の設定が追加されてます。
class ApplicationController < ActionController::Base helper :all # include all helpers, all the time protect_from_forgery # :secret => '3654ff1b49ed3fa2840774e44a6c80ff' end
app/controllers/todos_controller.rb
かなり変わりました。 2.0 の目玉 Restベースになってます!
- list() メソッドがなくなり index() にリスト機能が移行しました。これも restful に関係するのかなぁ???
- pagenateが無くなりました。以前のようにページングするには別途 プラグインを使わないといけません。 徒然なる開発メモ : will_paginate or paginating_find が参考になります。
- rest ベースになったので、更新 update() は PUTメソッドで動くようです。しかし通常のブラウザーはPUTをサポートしてないので、<input name="_method" type="hidden" value="put" /> で対応してます。
- rest ベースになったので メソッド毎に機能が限定されるので verify が無くなりました。
- rest ベースになり通常の HTML 以外、 XML で出力が出来ます。出力の切り替えに伴い処理を変える為の respond_to が追加されました。 これで、マッシュアップや Ajax(リッチクライアント)の対応も楽になります。
def create @todo = Todo.new(params[:todo]) respond_to do |format| if @todo.save flash[:notice] = 'Todo was successfully created.' format.html { redirect_to(@todo) } format.xml { render :xml => @todo, :status => :created, :location => @todo } else format.html { render :action => "new" } format.xml { render :xml => @todo.errors, :status => :unprocessable_entity } end end end
- XMLをリクエストするにはURLを http://localhost:3000/todos/1 の替わりに http://localhost:3000/todos/1.xml とします。
--- HTML出力 -------------------------------------------------------- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>Todos: show</title> <link href="/stylesheets/scaffold.css?1199674585" media="screen" rel="stylesheet" type="text/css" /> </head> <body> <p style="color: green"></p> <p> <b>Due:</b> 2008-01-07 </p> <p> <b>Task:</b> 仕事始め </p> <a href="/todos/1/edit">Edit</a> | <a href="/todos">Back</a> </body> </html> --- XML出力 -------------------------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <todo> <created-at type="datetime">2008-01-07T14:25:59+09:00</created-at> <due type="date">2008-01-07</due> <id type="integer">1</id> <task>仕事始め</task> <updated-at type="datetime">2008-01-07T14:25:59+09:00</updated-at> </todo>
- XML出力に対応しない場合は 1.2 と同じ記述で良いらしいです。
app/views/layouts/*
1.2 と同じ
app/views/todos/*
- テンプレートファイルのサフィックスが .rhtml から .html.erb に変わりました (なぜ? → コメント参照)
- index.html.erb(1.2では list.rhtml) は .content_columns などを使ったコーディングから、全カラムをベタ書きするようになりました ーー これは好きです ^^)
- また、 edit, new で共有ファイルをインクルートしていたのもベタ書きになりました。 DRY ではありませんが、実際のアプリでは new と edit の項目等が同じとはかぎらないので現実的かも。