ruby-on-rails - 如何在 gem Pundit 中使用命名空间

标签 ruby-on-rails ruby ruby-on-rails-4 pundit

我有 2 个 Controller ,1 个用于用户,1 个用于管理员。

Controller /articles_controller.rb

class ArticlesController < ActionController::Base
  ...
  def show 
    @article = Article.find(parmas[:id])
    authorize @article
  end
  ...
end

controllers/admin/articles_controller.rb

class Admin::ArticlesController < AdminController
  ...
  def show 
    @article = Article.find(parmas[:id])
    authorize @article
  end
  ...
end

我有 2 个文件策略 政策/article_policy.rb

class ArticlePolicy
  extend ActiveSupport::Autoload
  autoload :Admin

  attr_reader :user, :record

  def initialize(user, record)
    @user = user
    @record = record
  end

  def show?
    # allow show for every user. 
    true 
  end  
end

还有一个文件policies/admin/article_policy.rb

class Admin::ArticlePolicy

  attr_reader :user, :record

  def initialize(user, record)
    @user = user
    @record = record
  end

  def show?
    # only show if use have role manager 
    user.manager? 
  end  
end

但是当我使用帐户用户在/admin/articles/1/显示文章时。它显示正常,应该是“访问被拒绝”。

如何解决这个问题? (我使用 gem pundit 1.10)。

最佳答案

使用授权方法将命名空间作为参数传递。

class ArticlesController < ActionController::Base
  ...
  def show 
    @article = Article.find(parmas[:id])
    authorize [:admin, @article]
  end
  ...
end

关于ruby-on-rails - 如何在 gem Pundit 中使用命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37431792/

相关文章:

ruby-on-rails - Rails 如何创建 cookie 并稍后调用数据?

mysql - Rails 3 获取两个 MySQL 日期之间的天数

ruby - 将代码语句放在大括号中是好的编程习惯吗?

css - 无法设置 h1 标签及其内容的样式

css - 指向样式表的链接包括显示在 HTML 中,但是当 Turbolinks 打开时样式没有得到应用?

javascript - 鼠标悬停时显示每个表行的弹出窗口

ruby-on-rails - 如何使用 thin 和 ssl 获得干净的输出?

ruby-on-rails - Ruby on Rails - 无法加载此类文件 -- net/ssh

ruby-on-rails - Ruby 从数组中减去一个数

Ruby:如何在没有对象的情况下获取类的方法?