2011年8月11日木曜日

Rails3を初歩から学ぶ#5 ルートを定義しよう

ものすごくちゃんとしたRailsの日本語解説を見つけてしまった。
Ruby on Rails 3.0日記
一連のエントリの存在意義が、、、(あと20回くらい続く予定、、、)
まあ、自分自身の復習も兼ねているので続けますね。
=======================

前回モデルを実装しましたが、RailsではRESTfulなインターフェースに沿ってCRUD(create, read, update, delete)を実現する思想になっています。
HTTPメソッドの「GET」「POST」「PUT」「DELETE」を通じてリソースを操作します。
そこで前回作成したUserモデル用のインターフェースを定義しましょう。
config/route.rbを開きます。

Favmovie::Application.routes.draw do
  resources :users
end
赤字の行を追加します。
route.rbはルートを定義するファイルです。
ここの定義に従ってアクセスしてきた要求をどのコントローラのどのアクションに振り分けるかを決定します。
「resources」メソッドは指定したリソースに対するCRUD操作を自動で定義してくれる機能を提供しています。
ファイルを保存したら「rake routes」として定義されたルートを確認してみましょう。
たった1行でこれだけのルートが定義されます。
例えばHTTPのGETで「http://〜/users」にアクセスすると「usersコントローラ」の「index」アクションが呼ばれることが上図から分かります。
これらコントローラに対して対応するアクションを実装していくのが次の仕事です。
まずはコントローラの生成から始めましょう。
rails generate controller Users new
コントローラは対応するモデルの複数形が名前になります。ここでは「User」モデルに対応したコントローラであるため「Users」となります。
次のパラメータがコントローラに定義するアクションです。とりあえず今の段階では「new」アクションだけを用意します。
ちなみに先ほどの図から「new」アクションが呼ばれるのは「http://〜/users/new」に対してGETが要求されたときであることが分かります。
ちょっと試してみましょう。
rails server
としてサーバを起動します。
ブラウザを立ち上げてアドレス欄に「http://localhost:3000/users/new」と入力してアクセスすると「Users #new」とデカデカと表示されたページが表示されます。
これで正しくusersコントローラのnewアクションに処理が渡ったことが分かります。
ちなみにアクションを定義していないindexアクションにアクセスしてみましょう。
アドレス欄から「new」の部分を消してやればindexアクションです。
そうすると「Unknown action」と出て「The action 'index' could not be found for UsersController」というメッセージが表示されます。
これはUsersControllerにindexアクションは定義されていませんよ、ということを示しています。

ではこれからUsersControllerにnewアクションを実装していきます。
まずはテストコードから作成しますが、先ほどコントローラを生成したときにいくつか不要なテストファイルが出来ているので削除しておきます。
rm spec/helpers/users_helper_spec.rb
rm spec/views/users/new.html.erb_spec.rb
ヘルパはそれを利用するコントローラの検査で、ビューはインテグレーションテストで検証するので削除しておきます。この辺りは個人の好みで。
さて、コントローラのテストをつくりましょう。
spec/controller/users_controller_spec.rb を開きます。

# -*- coding: utf-8 -*-
require 'spec_helper'
describe UsersController do
  render_views
  describe "GET 'new'" do
    it "should be successful" do
      get 'new'
      response.should be_success
    end
    it "タイトルの検証" do
      get :new
      response.should have_selector("title", :content => "新規登録")
    end
    it "ユーザー名入力欄があること" do
      get :new
      response.should have_selector("input[name='user[name]'][type='text']")
    end
    it "パスワード入力欄があること" do
      get :new
      response.should have_selector("input[name='user[password]']
[type='password']")
    end
    it "パスワード確認欄があること" do
      get :new
      response.should    have_selector("input[name='user[password_confirmation]']
[type='password]']")
    end
  end #GET 'new'
end
newアクションはユーザーの新規登録のページを表示するアクションですので、ちゃんと新規登録ページを表示できているかの検証になります。
どこまで評価するかは色んな方針があると思いますが、見た目に関わる部分なのであまり細かく検証してしまうとデザインを変えるためびにNGになってメンドーなのでバランスを考えましょう。
ここではタイトルと最低限の入力項目が存在することのみ検証しています。
2行目にある「render_views」を忘れないでください。
これがないとviewを描画しないので必ずエラーになります。どう考えても検査をパスするハズなのになぁ、と悩んだら確認してみましょう。

次回はこの検証コードがパスできるようにコントローラを実装します。

0 件のコメント:

コメントを投稿