参考
- http://d.hatena.ne.jp/idesaku/20080430/1209579996
- http://api.rubyonrails.org/classes/ActionController/Routing.html
前回までで、ルーティングのためのヘルパメソッド
- 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 にとぶ


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


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


という感じ。
0 件のコメント:
コメントを投稿