首页 > 解决方案 > 我的毁灭?并投票?即使我已授权,方法也无法与 Pundit 一起使用

问题描述

我刚刚在我的应用程序上安装了 Pundit。我已经设法为新的 create 和 show 方法实现 pundit 但是当涉及到我的 destroy 和 up vote 方法时,我收到以下错误Pundit::NotDefinedError in HairstylesController#upvote unable to find policy `NilClassPolicy` for `nil

这是我的仓库,以便在需要时便于理解:https ://github.com/Angela-Inniss/hair-do

我已经在我的控制器中授权了两种方法,“upvote”和“destroy”。我已经更新了相关政策。请看下面的代码。

带有相关方法的控制器:

  def destroy
    authorize @hairstyle
    @hairstyle = Hairstyle.find(params[:id])
    @hairstyle.destroy
    redirect_to hairstyles_path
  end

  def upvote
    authorize @hairstyle
    @hairstyle = Hairstyle.find(params[:id])
    @hairstyle.upvote_from current_user
    redirect_to hairstyles_path
  end

pundit policy.rb 文件:


  def upvote?
    record.user == user
    # - record: the restaurant passed to the `authorize` method in controller
    # - user:   the `current_user` signed in with Devise.
  end

  def destroy?
    record.user == user
  end

index.html.erb 文件销毁 html

 <% if policy(hairstyle).destroy? %>
              <p><%= link_to "Delete", hairstyle_path(hairstyle),method: :delete, data: { confirm: "Are you sure?" }%></p>
           <% end %>

index.html.erb 文件支持 html(在我添加 pundit 之前有效)

   <%= link_to like_hairstyle_path(hairstyle), method: :put do %>
               <i class="fa fa-heart">
                <span><%= hairstyle.get_upvotes.size %><span>
               </i>
            <% end %>

我希望用户能够对发型进行投票 我希望用户能够删除他们的发型。

标签: ruby-on-railsrubypundit

解决方案


你不应该authorize在设置对象之后调用吗?试着从

authorize @hairstyle
@hairstyle = Hairstyle.find(params[:id])

@hairstyle = Hairstyle.find(params[:id])
authorize @hairstyle

推荐阅读