专家:user_signed_in 帮手
Pundit: user_signed_in helper
我正在使用 Pundit 处理授权。
我希望每个人都可以看到我的用户个人资料,所以在我的 user_policy.rb 中,我有:
def show?
true # Anyone can view a show
end
在我的 users/show.html.erb 中,"edit profile" 按钮仅在以下情况下显示:
<% if policy(@user).update? %>
<!-- show edit button -->
<% end %>
问题是,当我尝试访问个人资料但未登录时,Pundit 正在寻找 "user":
def update?
record == user || user.admin == true # Only user creator can update it
end
我有一个错误说用户是 nil,所以 admin 是未定义的。
我想这样做:
def update?
if user_signed_in?
record == user || user.admin == true # Only user creator can update it
else
false
end
end
但是user_signed_in?是一个设计助手,在 Pundit 中无法访问。
是否有我可以使用的等效方法或更好的方法?
你不能先检查用户变量是否存在吗?
def update?
user && (record == user || user.admin == true) # Only user creator can update it
end
正如理查德所说,您应该首先验证是否存在用户,以及他是所有者还是管理员。我喜欢这样读:
def update?
user.present? && (is_owner? || is_admin?)
end
private
def is_owner?
record.user == user
end
def is_admin?
user.admin #In your case user.admin is simple enough so you don't need that, but sometimes it's not.
end
我正在使用 Pundit 处理授权。 我希望每个人都可以看到我的用户个人资料,所以在我的 user_policy.rb 中,我有:
def show?
true # Anyone can view a show
end
在我的 users/show.html.erb 中,"edit profile" 按钮仅在以下情况下显示:
<% if policy(@user).update? %>
<!-- show edit button -->
<% end %>
问题是,当我尝试访问个人资料但未登录时,Pundit 正在寻找 "user":
def update?
record == user || user.admin == true # Only user creator can update it
end
我有一个错误说用户是 nil,所以 admin 是未定义的。 我想这样做:
def update?
if user_signed_in?
record == user || user.admin == true # Only user creator can update it
else
false
end
end
但是user_signed_in?是一个设计助手,在 Pundit 中无法访问。 是否有我可以使用的等效方法或更好的方法?
你不能先检查用户变量是否存在吗?
def update?
user && (record == user || user.admin == true) # Only user creator can update it
end
正如理查德所说,您应该首先验证是否存在用户,以及他是所有者还是管理员。我喜欢这样读:
def update?
user.present? && (is_owner? || is_admin?)
end
private
def is_owner?
record.user == user
end
def is_admin?
user.admin #In your case user.admin is simple enough so you don't need that, but sometimes it's not.
end