我想使用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: 'example@user.com')
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对象的访问,以便根本不返回任何帖子。这可能与Protector有关,还是我应该寻找另一种解决方案?
答案 0 :(得分:0)
这里的事情是你滥用它:)。您不应该尝试使您的关联不可读,因为它不是ActiveRecord的值。这是一种关系。
为了使事情有效 - 你必须使用范围。为您的scope {}
模型添加适当的Post
。然后,当您在.posts
上致电Project
时,它将为您提供由同一用户限制的Post
的关系。并且所描述的scope {}
Post
模型也将适用。
再次:不要试图描述相关模型 - 使用他们自己的保护块来定义他们的独立行为。这就是封装对Protector的作用。