gpt4 book ai didi

ruby-on-rails - Rails 5 - Pundit 范围

转载 作者:太空宇宙 更新时间:2023-11-03 16:42:56 24 4
gpt4 key购买 nike

我正在尝试学习如何在我的 Rails 5 应用程序中使用 pundit。

我正在尝试遵循本文中的方法。

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

应用程序 Controller :

include Pundit

提案 Controller :

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

我链接的文章与 Pundit 文档之间的主要区别在于 Pundit 自述文件说:

  1. 关于类范围 - 自述文件只有:

    类作用域

即它没有额外的“<范围”

  1. 自述文件在 Post Policy 中有这个(我在我的应用程序策略中有它 - 但也尝试将它添加到 Proposal Policy 中):

    attr_reader :user, :scope

  2. 自述文件在 Post Policy 中有这个(我在我的应用程序策略中有它 - 但也尝试将它添加到 Proposal Policy 中):

    def 初始化(用户,范围) @用户=用户 @scope = 范围结束

我尝试按照专家文档中的自述文件显示的方式进行操作 - 但我遇到了与尝试阅读文章时相同的错误。

我尝试更改 resolve 方法,使其始终返回 scope.all:

def resolve
if user.has_role?(:admin)
scope.all
else
scope.all
end

但我仍然得到同样的错误。

谁能看到我需要做什么才能使用 Pundit 示波器?

今年早些时候回顾我的相关问题 - 我可以看到专家 gem 上的自述文件和我链接的教程文章似乎都不正确:Rails 4 - Pundit - scoped policy for index

我无法从链接的 SO 帖子中获得任何解决方案 - 但这些答案中的概念比 gem 自述文件和教程更详尽。

下一次尝试

权威人士寻找用户的方式有些可疑。

我将 resolve 方法更改为非常简单的方法 - 检查用户的名字值是否等于字符串(这是我的用户表的记录,用于记录我登录的用户的名字):

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。

谁能看到我需要做什么才能让 Pundit 识别用户?

最佳答案

因此,在 codementor.io 上的另一个 session 之后,我没有解决方案,但我了解到我不能将 Pundit 范围与 statesman state_machine gem 一起使用。我要么需要找到另一个授权工具,要么使用不同的状态机工具。

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

如果我设法学习另一个状态机并再次尝试使用 Pundit,我会再次发帖分享我学到的关于如何使用 pundit 示波器的知识。继续。

关于ruby-on-rails - Rails 5 - Pundit 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41094763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com