2016-05-25 49 views
3

我有2個控制器,1個用戶和1個管理員。如何在gem中使用命名空間Pundit

控制器/ articles_controller.rb

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

控制器/管理/ 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 

而且一個文件策略/ 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 /中顯示文章時。它顯示正常,應該是「訪問被拒絕」。

如何解決這一問題? (我使用寶石專家1.10)。

回答

8

使用authorize方法將名稱空間作爲參數傳遞。

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