我有以下代码
- if current_user && !current_user.is_owner?(@product)
p do this
我添加了current_user &&
逻辑,因为如果用户没有登录会发生错误。但我想知道这是否是正确的方法。
答案 0 :(得分:1)
- if user_signed_in? && !current_user.is_owner?(@product)
p do this
答案 1 :(得分:1)
如果您需要处理来自登录用户的参数的视图,您可能最终必须解决视图中的其他问题。
如果未填充before_action
变量,我建议您添加一个重定向到登录页面的current_user
。
类似的东西:
class YourController < ActionController::Base
before_action :redirectIfNoCurrentUser
** your functions/actions **
def redirectIfNoCurrentUser
redirect_to(new_user_session_path) unless current_user
end
end
before_action
和skip_before_action
can be configured在每个操作的基础上使用:only
选项(如果需要)
答案 2 :(得分:1)
你说得对,这已经是正确的做法了。
在检查并看到current_user
返回false
之后,它知道条件将为false并且不执行条件的第二部分。
答案 3 :(得分:1)
最好将任何值检查为current_user.present?
而不是current_user
,因为前一个值返回一个布尔值。
您可以尝试使用authenticate_user!
设计方法,如果您不希望未登录的用户访问该页面。
class YourController < ActionController::Base
before_action :authenticate_user!, only: [:your_actions]
def your_actions
end
end
然后在您的观点中,您可以处理您的情况。
答案 4 :(得分:1)
您的代码很好,但是如果您想避免使用nil检查乱丢代码,您可以考虑使用null object pattern并使用定义的默认行为生成NullUser。
答案 5 :(得分:-1)
也许您可以尝试使用try method。
if current_user.try(:is_owner?, @product)
p do this
end