精華區beta Ruby 關於我們 聯絡資訊
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