我试图找出如何在我的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是否正确。在我的构造中,文章属于用户,但在我的索引操作中,我想向每个用户显示我的作用域允许他们看到的文章。
答案 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