2009年9月6日日曜日

[Railsのキホン][プラグイン] restful_authentication の使いかた (2) ルーティング編

前回、ユーザ認証の機能を導入するところまでできたので、ルーティングを加えてそれっぽく(?)してみます(restful_authentication の本質とは関係ない・・・)。

参考

前回までで、ルーティングのためのヘルパメソッド
  • login_url
  • logout_url
  • signup_url
が使えるようになっているので、これらを使います。

まず、認証が必要なコンテンツを作成。

$ script/generate controller secret index


secret_controller.rb に before_filter を追加。

# app/controllers/secret_controller.rb
class SecretController < ApplicationController
before_filter :login_required # この1行を追加
def index
end
end

これで、secretコントローラにアクセスされると、ログイン済みの場合は指定されたアクションを実行、未ログインの場合はログインページ (session/new) にとぶようになります。

ログイン後に表示される secret/index.html.erb を次のように編集。

# app/views/secret/index.html.erb
<h1>Logged in!</h1>
<p>
いらっしゃいまし
<%= current_user.login %>
さん。
</p>
<p>
<%= link_to 'ログアウト', logout_url %>
</p>

current_user で、ログイン中のユーザオブジェクトにアクセスできます。
logout_url を使ってログアウト用のリンクも追加。

コンテキストルートにアクセスされると、secret/index に遷移するよう、routes.rb に次の1行を追加。

map.root :controller => 'secret'


また、新規ユーザのために、ログインページ (views/session/new.html.erb) にSign Upページへのリンクを追加。

# app/views/session/new.html/erb
<h1>Welcome!</h1>

<% form_tag session_path do -%>
<p><%= label_tag 'login' %><br />
<%= text_field_tag 'login', @login %></p>

<p><%= label_tag 'password' %><br/>
<%= password_field_tag 'password', nil %></p>

<!-- Uncomment this if you want this functionality
<p><%= label_tag 'remember_me', 'Remember me' %>
<%= check_box_tag 'remember_me', '1', @remember_me %></p>
-->

<p><%= submit_tag 'Log in' %></p>

<!-- sign up ページへのリンク -->
<p>
Or <br>
<span style=" font-weight: bold">
<%= link_to 'Sign Up Now!', signup_url %>
</span>


ログイン失敗時、ログアウト時には session/new に遷移させます。

# app/controllers/sessions_controller.rb
def create
logout_keeping_session!
user = User.authenticate(params[:login], params[:password])
if user
...
else
...
render :action => 'new' # ログイン失敗
end
end

def destroy
logout_killing_session!
flash[:notice] = "You have been logged out."
redirect_to :action => 'new' # ログアウト
end


ログイン失敗時には flash[:error], ログアウト時には flash[:notice] にそれぞれメッセージが格納されるので、views/session/new.html.erb に以下を追加して、メッセージを(あれば)表示するようにします。

<% if flash[:error] %>
<p style="border: solid 1px red; padding: 3px; background-color: mistyrose; width: 400px;">
<%= flash[:error] %>
</p>
<% end %>

<% if flash[:notice] %>
<p style="border: solid 1px blue; padding: 3px; background-color: lightcyan; width: 400px;">
<%= flash[:notice] %>
</p>
<% end %>


ここまでで、何がどうなったかというと。

/ (ルートにアクセス) => secret/index => (未ログインの場合) session/new にとぶ

正しいログイン名・パスワードを入力 => secret/index が表示される


間違ったアカウント情報を入力 => session/new にとぶ

Sign Up Now! リンクをクリック => /signup にとぶ


アカウント情報を入力して Sign up ボタンクリック => secret/index にとぶ

ログアウト リンクをクリック => session/new にリダイレクト


という感じ。

0 件のコメント:

コメントを投稿