专家: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