2012-04-24 80 views
0

只是想知道是否有更好的方法來做到以下幾點:Rails:是否有一種乾淨的方式來定義影響嵌套資源/模型的方法?

用戶的has_many項目

項目的has_many名單

列出的has_many項目

某些用戶只能訪問某些項目。但是,如果用戶有權訪問項目,則用戶可以訪問屬於該項目的所有列表和項目。

下面是我想清理方法:

def check_for_user_access(resource, resource_class, user) 
    case resource_class 
    when 'Project' 
     if resource.user == user 
     return true 
     end 
    when 'List' 
     if resource.project.user == user 
     return true 
     end 
    when 'Item' 
     if resource.list.project.user == user 
     return true 
     end 
    else 
     return false 
    end 
end 

我不想因爲在訪問列表和項目爲user_id屬性其實只是依賴於項目。

是否有更好的方法來做到這一點比用switch語句來包裹各地略有不同,比較呢?

在此先感謝!

回答

1

也許一個簡單的方法來做到這一點是定義一個allow_access?爲每個資源類的方法 - 那麼所有的控制器所要做的就是讓資源如果用戶允許例如:

class Project < ActiveRecord::Base #I assume 
    def allow_access?(user) 
    return self.user == user 
    end 
end 

class List < ActiveRecord::Base 
    def allow_access?(user) 
    return self.project.user == user 
    end 
end 

class Item < ActiveRecord::Base 
    def allow_access?(user) 
    return self.list.project.user == user 
    end 
end 

和可選,把一個包裝在您的用戶模式:

class User < ActiveRecord::Base 
    def can_access?(resource) 
    resource.allow_access?(self) 
    end 
end 

然後你的方法可以與

user.can_access?(resource) 

如果你想收緊了一點東西來代替,您的用戶模型可以檢查是否資源響應allow_access?並作出適當的反應,如果它不...

+0

謝謝......那很完美。 – 2012-04-25 00:08:10

+0

不客氣:) – andrewdotnich 2012-04-26 00:01:29

0

兩件事情:

1)鑑於你的情況,我會考慮在列表和項目加入belongs_to :user,因爲它看起來像他們只能屬於一個用戶。

有了這個在你的名單和項目模式複製是不會傷害任何東西,它會給你一個顯著更簡單的方法,看看誰在你的應用程序給定對象屬於。

2)你應該看看CanCan。這是一個非常簡單和輕量級的授權庫,旨在調節對事物的訪問,就像您正在處理的一樣。

+0

我擔心增加另一個belongs_to,因爲它可能會導致信息可能會脫節(即項目屬於一個用戶,其列表屬於另一個)的情況。它不應該發生,但我不想檢查它。 感謝上慘慘的建議。其實我試圖爲它寫出能力規則,但如果我不知道它的話,這個提示肯定會有幫助。這是一個救生員。 感謝您分享您的想法! – 2012-04-25 00:10:19

+0

只是FWIW,你可以很容易地驗證,以確保它不'脫節',但我很高興你找到了你喜歡的解決方案。 – Andrew 2012-04-25 01:54:49

相關問題