首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 5-专家会议

Rails 5-专家会议
EN

Stack Overflow用户
提问于 2016-12-12 05:38:40
回答 1查看 1.7K关注 0票数 2

我正在努力学习如何使用我的Rails 5应用程序的专家。

我试图遵循本文中的方法。

代码语言:javascript
复制
https://learn.co/lessons/devise_pundit_readme

我正在努力从这种方法中找到一个有效的结果。具体来说,在我的索引中,我尝试使用定义的作用域的行是:

代码语言:javascript
复制
<% policy_scope(@user.proposals).each do |prop| %>

返回此错误:

代码语言:javascript
复制
undefined method `proposals' for nil:NilClass

我的设计是:

我有供用户和提案使用的模型。这些协会是:

用户:

代码语言:javascript
复制
  has_many :proposals

提案:

代码语言:javascript
复制
belongs_to :user

应用主计长:

代码语言:javascript
复制
include Pundit

提案控制人:

代码语言:javascript
复制
def index
    @proposals = Proposal.all
    # @bips = @proposal.bips
    authorize @proposals
  end

建议政策:

代码语言:javascript
复制
  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

提案索引:

代码语言:javascript
复制
<% policy_scope(@user.proposals).each do |prop| %>
    <%= prop.title %>
    <%= prop.user.full_name %>
    <%= prop.created_at %>
    <%= link_to 'More', proposal_path(prop) %>
<% end %>

当我尝试这样做时,我会得到一个错误--突出显示我的索引的这一行的问题:

代码语言:javascript
复制
  <% policy_scope(@user.proposals).each do |prop| %>

鉴于这与我链接的那篇文章完全相同,我不明白为什么它不起作用。

错误说:

代码语言:javascript
复制
undefined method `proposals' for nil:NilClass

我链接的文章和权威文档之间的主要区别在于,权威人士自述的意思是:

  1. 关于类范围- readme刚刚拥有: 类范围

也就是说,它没有额外的"<作用域“

  1. readme在Post策略中有这一点(我在我的应用策略中有它,但也尝试将它添加到提案策略中): attr_reader :user,:scope
  2. readme在Post策略中有这一点(我在我的应用策略中有它,但也尝试将它添加到提案策略中): def初始化(用户,范围) @user = user @scope =作用域结束

我试着按照专家文档中自述的方式来做--但我得到的错误与我试图跟随文章时的错误相同。

我尝试更改“解决”方法,以便它始终返回scope.all:

代码语言:javascript
复制
def resolve
       if user.has_role?(:admin)
         scope.all
       else
        scope.all
       end

但我还是会犯同样的错误。

有人能看到我需要做什么才能使用专家范围吗?

今年早些时候,通过阅读我的相关问题--我可以看到,无论是专家gem上的自述还是我链接的教程文章,似乎都是正确的:Rails 4 - Pundit - scoped policy for index

我无法从链接所以post获得任何解决方案的工作-但这些答案中的概念比创业板自述和教程更彻底。

下一次尝试

专家发现用户的方式有些可疑。

我将“解析”方法更改为非常简单的方法--检查用户的第一个名称值是否等于一个字符串(这是我登录的用户的第一个名称的“我的用户表”的记录):

代码语言:javascript
复制
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

当我尝试这样做时,我会发现一个错误:

代码语言:javascript
复制
undefined method `first_name' for nil:NilClass

我不认为专家知道如何找到用户。

当我在建议索引操作中添加一个byebug时,我得到:

代码语言:javascript
复制
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,试图找到人们如何让它工作的例子。我找不到任何不同的选择,我尝试了在我的链接的帖子。

我不知道这是否奇怪,但我能做到:

代码语言:javascript
复制
(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”时,我得到了同样的结果:

代码语言:javascript
复制
(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。

有人能看到我需要做些什么才能让专家来识别用户吗?

EN

回答 1

Stack Overflow用户

发布于 2016-12-17 00:01:57

因此,在关于codementor.io的另一次会议之后,我没有解决方案,但我已经了解到,我不能与政治家state_machine gem一起使用专家作用域。我要么需要找到另一个授权工具,要么使用不同的状态机。

我还了解到,专家自述机构在示例中有几个隐含的假设,这使得它们不适合使用。

如果我设法学习了另一台状态机,并再次尝试使用专家,我将再次发表文章,分享我所学到的关于如何使用专家作用域的知识。往前走。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41094763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档