[RoR ] RoR Access Control : before_filter
http://lightyror.blogspot.com/2006/09/ror-access-control-beforefilter.html
基本上,RoR要做到 Access Control 的部份
使用 before_filter 是最簡單的方式
before_filter 就是當你進入這個 controller
他會先經過這個 filter
然後才會執行相關的 action
所以我們可以在 before_filter 裡面
加入 session 裡面是不是有 user 資料
如果沒有,導入到 login 頁面
如果有,就直接自動執行
範例,一個 Controller 名字叫做 Apple ,他裡面要做 access control
class AppleController < ActionController::Base
before_filter :authorize
def authorize
redirect_to :controller => 'login' , :action => 'index' unless session[:user]
end
end
但是問題來了
今天一堆 controller
如果每個都得加上 before_filter
那不是加到累死了
而且嚴重違反 DRY 準則
所以我們想到了
所有controller 都繼承 ApplicationController
那我們加到 ApplicationController 裡面就好了
class ApplicationController < ActionController::Base
before_filter :authorize
def authorize
redirect_to :controller => 'login' , :action => 'index' unless session[:user]
end
end
呵呵,這樣就萬事大成了嗎?
怎麼瀏覽器不動了?
看看 log ,發現到 before_filter 的確 work
但是就連我們的登入頁面 LoginController 裡面的 index action 進入 before filter
所以呈現一個無窮迴圈
要怎麼做呢?
其實我們只要每個 controller 都有 before filter
但是 login controller 不需要 before filter 即可
class LoginController < ActionController::Base
skip_before_filter :authorize
.....
.....
.....
end
我們在 LoginController 裡面使用 skil_before_filter 將 before_filter skip 掉
大功告成!!!
--
lighty RoR 是一個介紹 lighttpd , SQLite , Ruby and Rails 的 Blog
http://lightyror.blogspot.com/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.218.90.242
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章