2011-11-23 63 views
1

我有幾個控制器需要一個正確的用戶來編輯/更新/刪除操作。什麼是Rails的方式來實現以下目標:Rails:驗證跨多個控制器的正確用戶

目前,每個控制器我有以下代碼:

class FooController < ApplicationController 
    before_filter :correct_user, :only => [:edit, :update, :destroy] 

    # normal controller code 

    private 

    def correct_user 
    @foo = Foo.find params[:id] 
    redirect_to some_path unless current_user == @foo.user 
    end 
end 

我有3個控制器類似的代碼。我開始把它帶到這樣的幫手:

module ApplicationHelper 
    def correct_user(object, path) 
    if object.respond_to? :user 
     redirect_to path unless object.user == current_user 
    end 
end 

但我想知道這是否是一個好辦法。什麼是可以接受的解決方法?

謝謝

編輯

這裏的正確的用戶檢查是因爲我要確保這只是筆者誰可以編輯/ deltes到每個對象。

爲了澄清,對象將是問題和帖子。我不想使用CanCan之類的東西,因爲它對於像這樣簡單的東西是過度的。

回答

2

我真的很喜歡使用RyanB的CanCan,它允許您基於用戶限制對操作的訪問權限,並將這種授權集中到基本上單個文件中。在GitHub上

編輯

沒問題。我聽到你在CanCan上 - 它需要一點時間才能啓動並運行,但它的目的是按照你要求的 - 按對象授權。

備選: 另一種方式做,這是將你的authoriship/CURRENT_USER支票給ApplicationController類,從您的其他所有控制器的繼承(所以他們將得到的代碼通過繼承 - 你不需要寫在多個控制器相同的代碼),它會看起來像......

class ApplicationController < ActionController::Base 
    ... 

    helper_method :correct_user 

    private 
    def correct_user(object, path) 
     redirect_to path unless object.user == current_user 
    end 

end 
+0

對不起,應該在我的文章中更好地澄清。請參閱帖子以進行更新。 –

+0

根據我對您的更新的最佳理解,我已經更新了我的答案。 – jefflunt

+0

我可以澄清一下嗎,你是否仍然在你的孩子控制器中以before_filter或者不同的方式調用它?如果是的話,你如何設定對象和路徑? – christian

0

你應該做到以下幾點:

def edit 
    @foo = current_user.foos.find(params[:id]) 
end 

該W ay,只有當前用戶是Foo的所有者時,他才能看到它。