如何在gem Pundit中使用命名空间

bav*_*ten 4 ruby ruby-on-rails ruby-on-rails-4 pundit

我有2个控制器,1个用户,1个用于管理员.

控制器/ articles_controller.rb

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

控制器/管理/ articles_controller.rb

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

我有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
Run Code Online (Sandbox Code Playgroud)

和一个文件policy/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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 10

使用authorize方法将名称空间作为参数传递.

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