Rails - 有范围的专家

时间:2016-07-18 10:29:47

标签: ruby-on-rails pundit scopes

我试图找出如何在我的Rails 4应用程序中编写权威权限。

我有一篇文章模型,有文章政策。文章政策有:

class ArticlePolicy < ApplicationPolicy
    attr_reader :user, :scope

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

    class Scope < Scope         
      def resolve
        if user == article.user
          scope.where(user_id: user_id)
        elsif approval_required?
          scope.where(article.state_machine.in_state?(:review)).(user.has_role?(:org_approver)) 
        else
          article.state_machine.in_state?(:publish)  
        end 
      end
    end 

    # TO DO - check if this is correct - I'm not sure.
    # I now think I don't need the index actions because I have changed the action in the articles controller to look for policy scope.
    # def index?  
    #   article.state_machine.in_state?(:publish)
    # end

    def article
      record
    end

文章控制者有:

def index
  @articles = policy_scope(Article)
  # query = params[:query].presence || "*"
  # @articles = Article.search(query)
end

我正在关注与范围相关的权威文档,并试图弄清楚为什么政策文件中显示的索引操作对我不起作用。我尝试了以下内容(如文档中所示):

 <% policy_scope(@user.articles).sort_by(&:created_at).in_groups_of(2) do |group| %>

但是我收到了这个错误:

undefined local variable or method `article' for #<ArticlePolicy::Scope:0x007fff08ae9f48>

谁能看到我出错的地方?

我不确定@ user.articles是否正确。在我的构造中,文章属于用户,但在我的索引操作中,我想向每个用户显示我的作用域允许他们看到的文章。

2 个答案:

答案 0 :(得分:0)

您可以在控制器中执行此操作。

@articles = policy_scope(Article).all

它将获得所有文章。如果您想根据搜索参数获取文章,可以试试这个。

@q = policy_scope(Article).search(params[:query])
@articles = @q.result

答案 1 :(得分:0)

我认为你可能需要在Scope类中明确地将文章设置为访问器,因为错误表明它不能识别“文章”。尝试像

这样的东西
attr_accessor :article

在初始化方法中设置它,你可以取消文章方法。

def initialize(record)
  @article = record
end