我正在努力学习如何使用我的Rails 5应用程序的专家。
我试图遵循本文中的方法。
https://learn.co/lessons/devise_pundit_readme我正在努力从这种方法中找到一个有效的结果。具体来说,在我的索引中,我尝试使用定义的作用域的行是:
<% policy_scope(@user.proposals).each do |prop| %>返回此错误:
undefined method `proposals' for nil:NilClass我的设计是:
我有供用户和提案使用的模型。这些协会是:
用户:
has_many :proposals提案:
belongs_to :user应用主计长:
include Pundit提案控制人:
def index
@proposals = Proposal.all
# @bips = @proposal.bips
authorize @proposals
end建议政策:
class ProposalPolicy < ApplicationPolicy
class Scope < Scope
def resolve
if user.has_role?(:admin)
scope.all
else
scope.where(:current_state == :draft)
end
end
end
def index?
true
end提案索引:
<% policy_scope(@user.proposals).each do |prop| %>
<%= prop.title %>
<%= prop.user.full_name %>
<%= prop.created_at %>
<%= link_to 'More', proposal_path(prop) %>
<% end %>当我尝试这样做时,我会得到一个错误--突出显示我的索引的这一行的问题:
<% policy_scope(@user.proposals).each do |prop| %>鉴于这与我链接的那篇文章完全相同,我不明白为什么它不起作用。
错误说:
undefined method `proposals' for nil:NilClass我链接的文章和权威文档之间的主要区别在于,权威人士自述的意思是:
也就是说,它没有额外的"<作用域“
我试着按照专家文档中自述的方式来做--但我得到的错误与我试图跟随文章时的错误相同。
我尝试更改“解决”方法,以便它始终返回scope.all:
def resolve
if user.has_role?(:admin)
scope.all
else
scope.all
end但我还是会犯同样的错误。
有人能看到我需要做什么才能使用专家范围吗?
今年早些时候,通过阅读我的相关问题--我可以看到,无论是专家gem上的自述还是我链接的教程文章,似乎都是正确的:Rails 4 - Pundit - scoped policy for index。
我无法从链接所以post获得任何解决方案的工作-但这些答案中的概念比创业板自述和教程更彻底。
下一次尝试
专家发现用户的方式有些可疑。
我将“解析”方法更改为非常简单的方法--检查用户的第一个名称值是否等于一个字符串(这是我登录的用户的第一个名称的“我的用户表”的记录):
class ProposalPolicy < ApplicationPolicy
class Scope #< Scope
# class Scope
attr_reader :user, :scope
def initialize(user, scope)
user = user
scope = scope
end
def resolve
if user.first_name == "Jane"
scope.all
else
scope.where(:current_state == :draft)
end
end
end当我尝试这样做时,我会发现一个错误:
undefined method `first_name' for nil:NilClass我不认为专家知道如何找到用户。
当我在建议索引操作中添加一个byebug时,我得到:
user.inspect
*** NameError Exception: undefined local variable or method `user' for #<ProposalsController:0x007fa3e8cf8698>
(byebug) @user
nil
(byebug) current_user
#<User id: 43, first_name: "Jane",所以,我试图让专家识别一个用户是有问题的。我已经在GitHub上搜索了数百个repos,试图找到人们如何让它工作的例子。我找不到任何不同的选择,我尝试了在我的链接的帖子。
我不知道这是否奇怪,但我能做到:
(byebug) policy_scope(Proposal)
Proposal Load (0.4ms) SELECT "proposals".* FROM "proposals"
#<ActiveRecord::Relation [#<Proposal id: 17, user_id: 43, title: "asdf", description: "adsf", byline: "asdf", nda_required: true, created_at: "2016-11-16 00:28:31", updated_at: "2016-11-28 01:16:47", trl_id: 1>]>user_id 43有一个first_name属性,即Jane。我认为这可能是某种东西起作用的迹象,但当我改变决心方法,要求"John“而不是"Jane”时,我得到了同样的结果:
(byebug) policy_scope(Proposal)
Proposal Load (0.8ms) SELECT "proposals".* FROM "proposals"
#<ActiveRecord::Relation [#<Proposal id: 17, user_id: 43, title: "asdf", description: "adsf", byline: "asdf", nda_required: true, created_at: "2016-11-16 00:28:31", updated_at: "2016-11-28 01:16:47", trl_id: 1>]>显然,这一次是不正确的,因为这个建议所属的用户的名字不是John。
有人能看到我需要做些什么才能让专家来识别用户吗?
发布于 2016-12-17 00:01:57
因此,在关于codementor.io的另一次会议之后,我没有解决方案,但我已经了解到,我不能与政治家state_machine gem一起使用专家作用域。我要么需要找到另一个授权工具,要么使用不同的状态机。
我还了解到,专家自述机构在示例中有几个隐含的假设,这使得它们不适合使用。
如果我设法学习了另一台状态机,并再次尝试使用专家,我将再次发表文章,分享我所学到的关于如何使用专家作用域的知识。往前走。
https://stackoverflow.com/questions/41094763
复制相似问题