2010-11-08 64 views
1

我該怎麼幹?DRY me:Rails code

def correct_user 
    @company = RealEstateCompany.find(params[:id])  
    if(current_user != @company.user) 
    redirect_to(root_path) 
    end 
end 

def correct_user 
@company = ConstructionCompany.find(params[:id])  
if(current_user != @company.user) 
    redirect_to(root_path) 
end 
end 

答案是下方,它是作爲遵循一個模塊中:

def correct_user_for_controller?(controller_name) 
    @company = controller_name.classify.constantize.find(params[:id])  
    redirect_to(root_path) unless (current_user == @company.user) 
end  

那麼任何控制器內包括的模型,並用

correct_user_for_controller?("ConstructionCompany") 

correct_user_for_controller?("RealEstateCompany") 
+0

RealEstateCompany和ConstructionCompany是獨立的模型嗎?如果您只有一個公司模型,這將是DRYer。 – 2010-11-08 00:23:47

+0

是RealEstateCompany與ConstructionCompany在幾個方面不同,例如ConstructionCompany has_many:項目,而RealEstateCompany則沒有。 – daniel 2010-11-08 00:44:51

回答

1

假設你有想裏面ConstructionCompaniesController這個設施和RealEstateCompaniesController

def correct_user 
    @company = controller_name.classify.constantize.find(params[:id])  
    redirect_to(root_path) unless (current_user == @company.user) 
end 
+0

是的,這雖然沒有很好解釋,但足以提出答案! – daniel 2010-11-08 02:07:20

3
module OwnershipPermission 
    def accessible_for_user?(user) 
     self.user == user 
    end 
end 

只需在兩個模型中包含此模塊並執行模型級別檢查即可。 您也可以爲控制器創建一個模塊,但我強烈建議不要這樣做(傷害可維護性)。

+0

問題不是要把current_user!= @ company.user,問題是找到當前用戶,我必須通過@company = ConstructionCompany.find(params [:id])找到它 – daniel 2010-11-08 01:48:34

+0

'@ company = ConstructionCompany.find(params [:id])'? – glebm 2010-11-08 01:49:48

+0

是的我認爲我不能幹這個代碼,有4個模型是我有相同的方法correct_user,我發現使用控制器請求的實例,然後檢查所有者 – daniel 2010-11-08 02:01:03

2

看起來您正在嘗試執行授權檢查(</clippy>)。

您是否檢出了任何現有的全面授權解決方案?利用別人的努力解決這個共同的問題可能是有意義的。

這個thread on authorization for rails給出了一些例子。特別是,CanCan你可以包括在此方法是這樣的,你試圖保護:

authorize! :read, @company 

它說「不當前用戶有權限看到@company的詳細信息」。