フィルタは、アクションの前後で処理する仕組みだね!
before_filter :start_logger …中略… private def start_logger logger.debug('[Start] ' + Time.now.to_s) end
Started GET "/ctrl/session_show" for 127.0.0.1 at 2012-01-15 08:21:45 +0900 Processing by CtrlController#session_show as HTML [Start] 2012-01-15 08:21:45 +0900 Rendered ctrl/session_show.html.erb within layouts/application (0.0ms) Completed 200 OK in 47ms (Views: 46.9ms | ActiveRecord: 0.0ms)
around_filter :around_logger …中略… private def around_logger logger.debug('[Aroud Log Start] ' + Time.now.to_s) yield #ここでアクションを実行ね! logger.debug('[Aroud Log End] ' + Time.now.to_s) end
Started GET "/ctrl/session_show" for 127.0.0.1 at 2012-01-15 08:38:34 +0900 Processing by CtrlController#session_show as HTML [Aroud Log Start] 2012-01-15 08:38:34 +0900 Rendered ctrl/session_show.html.erb within layouts/application (0.0ms) [Aroud Log End] 2012-01-15 08:38:35 +0900 Completed 200 OK in 31ms (Views: 31.2ms | ActiveRecord: 0.0ms)
before → around(アクション) →after
before_filter :start_logger, :only => [ 'session_show','session_regist' ] after_filter :end_logger, :except => 'session_show'
before_filter :auth, :only => 'session_show' …中略… private def auth name = 'abc' password = 'cdf' authenticate_or_request_with_http_basic('Railbook') do |n,p| name == n && password == p end end
def auth2 members = {'abc' => 'cdf' } authenticate_or_request_with_http_digest('Railbook') do |name| members[name] end end
before_filter :check_logined, :only => 'index' …中略… def index render :text => 'ユーザ=[' + @usr + ']で、indexが表示できたよ!' end private def check_logined members = {'abc' => 'cdf' } # 当然ほんとは、Digest::SHA1.hexdigestとかで暗号化は必須ね! if session[:usr] && members[session[:usr]] # セッションがあって、かつmembersにデータがあれば、OK @usr = session[:usr] else reset_session unless members[session[:usr]] # membersに見つからないなら、セッションをリセット flash[:referer] = request.fullpath # ログインページから元々のURLへのリダイレクト用にフラッシュで渡す redirect_to :controller => 'login', :action => 'index' end end
<p style="color: Red"><%= @error %></p> <%= form_tag :action => 'auth' do %> <div class="field"> <label>ユーザ名:<%= text_field_tag(:username) %></label> </div> <div class="field"> <label>パスワード:<%= password_field_tag(:password) %></label> </div> <%= hidden_field_tag :referer, flash[:referer] %> <%= submit_tag 'ログイン' %> <% end %>
class LoginController < ApplicationController def auth members = {'abc' => 'cdf' } # 当然ほんとは、Digest::SHA1.hexdigestとかで暗号化は必須ね! if members[params[:username]] && params[:password] == members[params[:username]] session[:usr] = params[:username] redirect_to params[:referer] else flash.now[:referer] = params[:referer] # NG時のログインページ用に、遷移先をflash.nowで再設定 @error = 'ユーザ名/パスワードが間違ってる!!' render 'index' end end end
def index render :text => 'ユーザ=[' + @usr + ']で、indexが表示できたよ!<br>ログアウトは<a href="/ctrl/logout">こちら</a>' end def logout reset_session redirect_to '/' end