保护与保护者的联系

时间:2013-11-01 04:15:15

标签: ruby-on-rails ruby activerecord protector

我想使用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有关,还是我应该寻找另一种解决方案?

1 个答案:

答案 0 :(得分:0)

这里的事情是你滥用它:)。您不应该尝试使您的关联不可读,因为它不是ActiveRecord的值。这是一种关系。

为了使事情有效 - 你必须使用范围。为您的scope {}模型添加适当的Post。然后,当您在.posts上致电Project时,它将为您提供由同一用户限制的Post的关系。并且所描述的scope {} Post模型也将适用。

再次:不要试图描述相关模型 - 使用他们自己的保护块来定义他们的独立行为。这就是封装对Protector的作用。