ruby-on-rails - 我的毁灭?并投票?即使我已授权,方法也无法与 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 %>
我希望用户能够对发型进行投票 我希望用户能够删除他们的发型。
解决方案
你不应该authorize
在设置对象之后调用吗?试着从
authorize @hairstyle
@hairstyle = Hairstyle.find(params[:id])
至
@hairstyle = Hairstyle.find(params[:id])
authorize @hairstyle
推荐阅读
- c# - Razor 视图的性能分析
- git - Git:如何递归地添加文件夹中的所有文件
- python - 熊猫 groupby 和 value_counts
- python - Python 线程模块 - GUI 仍然冻结
- android - 使用 Retrofit 2.0.0 将多个文件发送到服务器
- javascript - 从两个 observable 访问数据,无需多个订阅
- powershell - Powershell 中的 Runspace Dispose(特定于 GUI)
- javascript - 带有 Intent 的 Alexa 调用名称不起作用
- python - tensorflow:在变量中找到较大的值并替换它
- c - 对联合数据的原始访问