我想使用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可以做到这一点吗?或者我应该寻找其他解决方案?
发布于 2013-11-01 17:27:07
这里的问题是您滥用了它:)。您不应该试图使您的关联不可读,因为它并不是ActiveRecord的真正值。这是一种关系。
因此,为了让它工作-你必须使用作用域。向您的Post模型添加适当的scope {}。然后,当您在Project上调用.posts时,它将为您提供一个由同一用户限制的Post关系。所描述的Post模型的scope {}也同样适用。
再说一次:不要试图描述相关的模型--使用它们自己的保护块来定义它们的独立行为。这就是Protector的封装方式。
https://stackoverflow.com/questions/19720689
复制相似问题