【问题标题】:CanCan, restrict view action only for resources with a certain tagCanCan,仅针对具有特定标签的资源限制查看操作
【发布时间】:2012-11-16 15:49:15
【问题描述】:

我有一个使用 devise 和 cancan 的 rails 应用程序。

我有一个用户(无论是否登录)都可以阅读的帖子资源:

user ||= User.new
if user.has_role? :admin
  can :manage, :all
else
  can :read, Post
end

我使用标签系统对帖子进行分类,我想创建一个名为“restricted”的标签,其显示操作仅限于登录用户。

以下是我如何调用带有受限标签的帖子:

@post.tags.find_by_name("restricted")

我应该在控制器中使用 if 语句还是以某种方式限制ability.rb 文件中的操作?

【问题讨论】:

  • 我不确定是否理解您的问题,但您可以限制控制器中的操作,例如:load_and_authorize_resource only: [:new,:create]
  • @KienThanh,是的,但只有在帖子具有特定标签时,我才需要限制显示操作,而不是所有显示操作。例如,我有一个标记为“foo”的帖子和一个标记为“restricted”的帖子。登录用户应该能够对两个帖子执行显示操作,应该允许未登录用户查看“foo”帖子,但不能查看“受限”帖子
  • 也许你可以在下面添加can :read, Post这个:cannot :read, Post.join(:tags).where(tags: { name: "restricted" } )
  • @KienThanh,看起来我无法从能力模型中做到这一点:未定义的方法 `join' for #<0x007fdb51b67a90>

标签: ruby-on-rails ruby-on-rails-3 devise cancan


【解决方案1】:

您可以在can :read, Post下方添加此代码:

cannot :read, Post, tags: { name: "restricted" }

此限制未登录用户无法阅读帖子标签名称为“restricted”。

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多