我试图制作一个“更新和删除按钮,只有在用户创建帖子或用户或主持人和/或主持人时才会显示。
我目前的帖子是
def user_is_authorized_for_post?(post)
current_user && (current_user == post.user || current_user.admin?)
end
我的按钮是:
<% if user_is_authorized_for_post?(@post) %>
<%= link_to "Edit", edit_topic_post_path(@post.topic, @post), class: 'btn btn-success' %>
<%= link_to "Delete Post", [@post.topic, @post], method: :delete, class: 'btn btn-danger', data: { confirm: 'Are you sure you want to delete this post?' } %>
<% end %>
更新:我将PostsHelper更新为:
def user_is_authorized_for_post?(post)
current_user && (current_user == post.user || current_user.admin?) || (current_user == post.user || current_user.moderator?)
end
它有效,但我的问题是,是否有更好的编码方式,因为我觉得它很长。
答案 0 :(得分:1)
是的,写一个更简短的方法。
您可以使用guard子句来缩短方法定义:
def user_is_authorized_for_post?(post)
return false unless current_user # the aforementioned guard clause
current_user == post.user || current_user.admin? || current_user.moderator?
end
答案 1 :(得分:1)
您的代码没问题,但更好的方法是使用授权系统实现它,pundit是一个不错的选择,因为用户可以通过 Curl 或<来手动更新帖子强>邮差强>
您将拥有管理不同授权逻辑的策略类:
class PostPolicy < ApplicationPolicy
def edit?
update?
end
#user is equivalent to the current_user and record == post
def update?
user && (user == record.user || user.admin?) || (user == record.user || user.moderator?)
end
end
<% if policy(@post).edit? %>
# the button
<% end %>
def edit
@post = Post.find params[:id]
authorized @post
end
def update
@post = Post.find params[:id]
authorize @post
# Rest of your code
end