2013-11-01 67 views
0

我想使用Protector來控制未經授權的用戶可以在我的模型上看到的字段,但我無法使用它來隱藏關聯。保護與保護者的關聯

我有一個項目模型和後期模型。他們部分看起來像這樣。

class Project < ActiveRecord::Base 
    has_many :posts 
    protect do 
    can :read, %w(title) 
    cannot :read, %w(posts) 
    end 

end 

class Post < ActiveRecord::Base 
    belongs_to :project 
    protect do 
    cannot :read 
    end 
end 

現在讓我們說我創造了一些記錄看起來像這樣的

Project.create(title: 'project one') 
User.create(email: '[email protected]') 
Post.create(project_id: Project.first.id, title: 'post one') 
Post.create(project_id: Project.first.id, title: 'post two') 

當我問Project.first.restrict!(User.first).posts我得到一個非空ActiveRecord的關係。我無法訪問關係中對象的標題,但我可以看到他們的ID和有多少帖子。我寧願能夠限制對Project對象的訪問,以便根本不返回任何帖子。這可能與保護者,或者我應該尋找另一種解決方案?

回答

0

這裏的事情是你濫用它:)。你不應該試圖讓你的關聯不可讀,因爲它不是ActiveRecord的一個價值。這是一種關係。

所以要使事情有效 - 你必須使用範圍。添加適當的scope {}到您的Post模型。然後當您撥打Project時致電.posts,它會給你一個關聯Post s受同一用戶限制。並且描述的scope {}Post模型也將適用。

同樣:不要試圖描述相關模型 - 使用他們自己的保護模塊來定義它們的獨立行爲。這是封裝對Protector的作用方式。