【问题标题】:Protecting associations with Protector保护与 Protector 的关联
【发布时间】:2013-11-01 04:15:15
【问题描述】:

我想使用 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 是否可以做到这一点,还是我应该寻找其他解决方案?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord protector


    【解决方案1】:

    这里的问题是你滥用它:)。你不应该试图让你的关联不可读,因为它在 ActiveRecord 方面并不是真正的价值。这是一个关系。

    所以要让事情发挥作用——你必须使用作用域。将正确的 scope {} 添加到您的 Post 模型中。然后,当您在 Project 上调用 .posts 时,它会给您一个受同一用户限制的 Posts 的关系。并且Post 模型中描述的scope {} 也将适用。

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

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 2019-08-14
      • 1970-01-01
      相关资源
      最近更新 更多