読者です 読者をやめる 読者になる 読者になる

[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
--- 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>&#20181;&#20107;&#22987;&#12417;</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 の項目等が同じとはかぎらないので現実的かも。