2012-04-19 36 views
1

所以我有3種類型的用戶:Rails的允許訪問一個頁面,而不會限制整個控制器

admin 
moderator 
regular user 

我有一個控制器級系統這樣鎖定了主持人和管理頁面:

def authorize 
    unless User.find_by_id(session[:user_id]) and User.find_by_id(session[:user_id]).moderator == true 
    redirect_to login_url, :notice => "Please log in with a moderator account" 
    end 
end 

def authorize_admin 
    unless User.find_by_id(session[:user_id]) and User.find_by_id(session[:user_id]).admin == 1 
    redirect_to login_url, :notice => "Only admins can access the page you tried to access" 
    end 
end 

但我需要讓普通用戶訪問多個控制器的編輯頁面(當然還有更新操作)。但只是編輯和更新。

如果我做的:

before_filter :authorize, :except => :edit 

那麼任何人(即使不登錄)訪問這些頁面。

我該如何去做類似的事情?

編輯

按蒂洛的建議下,我增加了以下的application_controller.erb文件:

def update_successful 
    skip_before_filter :authorize 
    end 

爲了能夠服務於update_successful頁普通用戶編輯了一個條目後。不過,我得到這個錯誤:

undefined method `skip_before_filter' for #<HomeController:0x007ff782aeb6f0> 
+0

你目前如何使用這兩種方法?作爲'before_filter'? – Thilo 2012-04-19 15:23:10

+0

是的,before_filter。 – kakubei 2012-04-19 15:23:59

回答

1

您可以跳過任何明確的全球應用過濾器:

skip_before_filter :authorize, :only => [:edit, :update] 

還是不要把它應用到擺在首位的相關行動:

before_filter :authorize, :except => [:edit, :update] 

編輯

要回答你的更多問題重刑:添加到您的應用程序控制器:

def upload_successful 
end 

這是一個明確定義的動作一個空方法,到目前爲止已經爲隱式的Rails渲染home/upload_successful.html.haml模板時使用。然後,通過修改你的過濾器從該方法去除認證:

before_filter :authorize, :except => [:upload_successful] 

下面是Rails的一個很好的introduction to rendering - 它有助於瞭解在默認情況下,這是你的upload_successful模板已被顯示的內容,而無需匹配的控制器或動作呈現定義。

+0

但這樣,任何人都可以看到這些網頁,甚至沒有一個帳戶。我做了你的建議,並且向每個有編輯和更新方法的控制器添加了'before_filter:authorize_user'(它檢查一個普通用戶是否登錄)。不知道這是否是正確的做法,仍然存在一些問題。 – kakubei 2012-04-19 15:32:34

+0

此外,我有一個頁面,我希望常規用戶在成功更新後重定向到該頁面。我試着在視圖(haml模板)中放入'skip_before_filter:authorize',但這似乎不起作用。這只是一個常規頁面,位於沒有控制器的「主目錄」目錄中。我如何讓他們訪問該頁面?(感謝您的答覆BTW)。 – kakubei 2012-04-19 15:55:21

+0

過濾器放在控制器上,每個動作都有一個 - 如果不是明確的話,那麼就是默認的'ApplicationController'。只需將一個(空)方法添加到具有頁面名稱的方法中,併爲其設置過濾器。 – Thilo 2012-04-19 16:34:12

相關問題