Head First Rails

Head First Rails』を読んで Rails をザックリ勉強しました。副題に「Rails の基本」とあるように、基本しか書かれていないのでテストやデプロイにはそれほど言及していません。ただし、Rails の概念がすんなり頭に入りますので、初学には最適だと思います。

以下、Rails に関するメモです。

環境

$ ruby --version
ruby 1.8.7 (2010-12-23 patchlevel 330) [i686-darwin10]
$ rails -v
Rails 2.3.4

ざっくり

config/coutes.rb に URL とコントローラのマッピングを定義して、app ディレクトリ以下の controllers/models/views に各コードを記述していく。MVC がそれぞれ名前によって結びついている。(Convention Over Configuration: 設定より規約)。

Rails アプリを作る

$ rails hoge

Web サーバ (WEBrick) を起動する

$ ruby script/server

ケルトンを作成する

$ ruby script/generate scaffold ticket name:string

scaffold モデル名 フィールド名:型 という書式で、フィールドは任意の数だけ定義できる。

テーブルを作成する

$ rake db:migrate

モデルにフィールドを追加する

$ ruby script/generate migration AddPhoneToTickets phone:string

migration Addフィールド名Toテーブル名 フィールド名:型 という書式。

scaffold を使わない場合

$ ruby script/generate model ad name:string
$ ruby script/generate controller ads

script/generate でモデルとコントローラを個々に作成できる。モデルは単数形、コントローラは複数形にする。

ルーティングの設定

map.connect '/ads/:id', :controller=>'ads', :action=>'show'

コントローラからビューにデータを渡す

def show
  @ad = Ad.find(param[:id])
end

ビューはアクション名のファイルが自動的に使われる (views/ads/show.html.erb)。

<p>
  <strong>Name:</strong><%= @ad.name %>
</p>

テンプレートの継承

app/views/layouts/ads.html.erb がテンプレートファイルとなる。

<%= yield %>

テンプレートの yield 部分に各アクションのビューが展開される。

フォームの書き方

フォームは form_for メソッドで作成する。

<% form_for(@ad, :url=>{:action=>'create'}) do |f| %>
...
<%= f.text_field :name %>
...
<% end %>

モデルには params としてフォームの値が渡ってくる。

モデルをデータベースに保存する

def create
  @ad = Ad.new(params[:ad])
  if @ad.save
    redirect_to "/ads/#{@ad.id}"
  else
    render :action => 'new'
  end
end

save で保存。

モデルの情報を更新する

def update
  @ad = Ad.find(params[:id])
  if @ad.update_attributes(params[:ad])
    redirect_to "/ads/#{@ad.id}"
  else
    render :action => 'edit'
  end
end

モデルをデータベースから削除する

def destroy
  @ad = Ad.find(params[:id])
  @ad.destroy
  redirect_to '/ads/'
end

モデルの関連

複数のモデルを組み合わせる場合、例えば flights が幾つかの seat を持つ場合。

class Flight < ActiveRecord::Base
  has_many :seats
end
lass Seat < ActiveRecord::Base
 belongs_to :flight
end

バリデート

class ClientWorkout < ActiveRecord::Base
  validates_numericality_of :paid_amount
  validates_presence_of :trainer
  validates_presence_of :client_name
end

モデルに validates_バリデート内容_of メソッドでチェック項目を記述する。また、モデルに validate という名前のメソッドを定義することもできる。

雑感

私は Ruby に関しては掲示板しか作ったことがない程度の経験値 (ほぼゼロ) ですが、Rails から入っても問題ありませんでした。

下記のような文法に違和感がありましたが Ruby はメソッド呼び出しの括弧を省略できると知り、すんなり読めるようになりました。

validates_presence_of :trainer

ECMAScript で記述するならば

validatesPresenceOf("trainer");

このようになります。

目次

  1. さあ始めよう
  2. scaffold を超えて
  3. 登録、更新、そして削除
  4. データベースファインダ
  5. データの検証
  6. 「つながり」を作る
  7. Ajax
  8. XML といろいろな表現方法
  9. REST と Ajax
  10. 現実世界のアプリケーション