Ruby on rails 保护与保护者的联系

Ruby on rails 保护与保护者的联系,ruby-on-rails,ruby,activerecord,protector,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

我想使用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.first.restrict!(User.first).posts
我得到一个非空的ActiveRecord关系。我无法访问关系中对象的标题,但我可以看到它们的ID以及有多少帖子。我希望能够限制对项目对象的访问,这样就不会返回任何帖子。保护器是否可以实现这一点,或者我是否应该寻找其他解决方案?

这里的问题是您误用了它:)。您不应该试图使您的关联不可读,因为它在ActiveRecord中不是一个真正的值。这是一个关系

因此,要使事情顺利进行,必须使用作用域。将适当的
scope{}
添加到您的
Post
模型中。然后,当您在
Project
上调用
.posts
时,它将为您提供受同一用户限制的
Post
s关系。所描述的
Post
模型的
scope{}
也将适用

再次强调:不要试图描述相关模型——使用它们自己的保护块来定义它们的独立行为。这就是保护器的封装工作原理

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')