2011年8月26日金曜日

Rails3を初歩から学ぶ #10 サインイン画面をつくる

この一連のエントリは
Ruby on Rails 3 Tutorial: Learn Rails by Example (Addison-Wesley Professional Ruby Series)
で参考に学んだことを凝縮してお送りしています。

ユーザーを新規登録する処理まで完成しましたので、今回から登録済みユーザーを認証する部分をつくってきましょう。セッション管理用に新たなコントローラを用意します。既存のUserモデルを参照するのでモデルは新たにつくる必要はありません。
rails generate controller Sessions new create destroy
まとめてnew、create、destroyアクションも生成しておきます。
それぞれサインイン画面の表示、セッションの生成(サインイン)と破棄(サインアウト)に対応しています。
RSpec用のテストファイルも同時に生成されていますが、spec/views/sessions/の下は必要ないので削除してしまいましょう。
それではルートを定義しておきましょう。
new、create、destroyそれぞれに対するgetが定義されているので削除しておいて、代わりに以下のように定義します。
resources :sessions, :only => [:new, :create, :destroy]
「resources」に渡すとindex,create,new,edit,etc....と一式自動で定義されますが、今回のsessionsコントローラに対してはサインイン画面を表示するnewとセッションを生成するcreateとセッションを破棄するdestroyのみが必要なので「:only」オプションで指定します。
それでは生成されたコントローラに対してテストコードを書いていきます。

# -*- coding: utf-8 -*-
require 'spec_helper'
describe SessionsController 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='session[name]'][type='text']")
end
it "パスワード入力フィールドがあること" do
get :new
response.should have_selector("input[name='session[password]']
[type='password']")
end
end #GET 'new'
end
Usersコントローラのnewアクション向けのテストコードとほぼ同じです。
フィールドの名前がsessionとなることが異なります。
newアクション用のコントローラは@titleに「サインイン」を格納するのみ。
対応するviewコードは「app/views/session/new.html.erb」です。
以下のように編集します。

<h1>サインイン</h1>
<%= form_for(:session, :url => sessions_path) do |f| %>
<div class="field">
<%= f.label :name %>&;t;br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :password %>%lt;br />
<%= f.password_field :password %>
</div>
<div class="actions">
<%= f.submit "サインイン" %>
</div>
<% end %>
<p><%= link_to "新規登録はこちら", new_user_path %></p>
これも基本的にはusers/newと同じなのですが「form_for」に渡しているパラメータが異なります。users/newではコントーラで生成したUserモデルのインスタンス変数を指定していましたが、サインイン時には該当するインスタンスが無いので「:session」とSessionsコントローラへ振り分けるよう指定します。
ただしこのままだとviewと同じ「sessions/new」に対してPOSTするHTMLが出力されていまうので、「:url => sessions_path」として「sessions/」に対してPOSTするよう指定しています。

0 件のコメント:

コメントを投稿