2011-05-20 34 views
1

在我之前,過濾器,我稱之爲包含下面的代碼的方法:的Rails的before_filter檢查多個角色

authorized_for_roles :administrator 

在我application_controller

def authorized_for_roles(*roles) 
roles.each{|role_name| return true if current_user.role.name == role_name} 

這似乎並不甚至要返回true登錄時與管理員角色一起。我的語法不正確?

如果我轉換的代碼只是讀

return true if current_user.is_an_administrator? 

一切都很正常。有人能告訴我如何修改代碼來檢查is_an嗎?爲傳遞給該方法的每個角色?我希望能夠做到像

authorized_for_roles :administrator, :moderator 

我試圖

但這並沒有工作。

編輯:改變行間距,使代碼片段格式爲這樣...

+0

你是否在使用gem作爲角色?什麼是is_an_administrator?定義? – ronnieonrails 2011-05-20 17:13:41

+0

我從Ernie Miller那裏得到 - [link] http://metautonomo.us/2008/09/30/easy-role-based-authorization/'code' def method_missing(method_id,* args)if match = matches_dynamic_role_check?( method_id)tokenize_roles(match.captures.first).each do | check |返回true如果role.name.downcase ==檢查結束返回false else超級結束私人def比賽match_dynamic_role_check?(method_id)/^is_an?_((a-a-Z]\w*)\?$/.match(method_id .to_s)end def tokenize_roles(string_to_split)string_to_split.split(/ _ or_ /)end – Joe 2011-05-20 19:30:00

回答

2

您要使用的可枚舉#否?方法。在你的第一個例子中:

def authorized_for_roles (*roles) 
    roles.any? { |role_name| current_user.role.name == role_name } 
end