我的申请表中有@user = User.find(current_user.id)
等陈述。
有时用户可能会输入一个nil变量(例如current_user为nil的新用户)。
我敢肯定,这样做的愚蠢方法就是分散各处的陈述,如......
if current_user.exists?
@user = User.find(current_user.id)
else
redirect_to root_url
---*or*---
@user = "new" # for use with if/case statements later on
end
处理这种困惑的优雅方法是什么?
答案 0 :(得分:0)
假设您使用的语言是面向对象的,我会创建一个包含当前用户上下文的对象。默认情况下,您可以为访问权限非常有限的未知用户使用CurrentUserContext实例。
当用户登录时,您可以将所有用户信息和安全信息加载到CurrentUserContext的新实例中。
这只是一个粗略的想法,但也许有帮助。
编辑:这样你就不需要创建所有类型的安全例外规则......你只需要假设当前上下文实例的安全设置,并根据它来调整应用程序行为。
答案 1 :(得分:0)
当没有当前用户时获取nils:
@user = current_user && User.find(current_user.id)
当没有当前用户时获得“新”:
@user = current_user ? User.find(current_user.id) : 'new'
两者都没有真正解决问题,但现在至少它在一条线上。对于更通用的解决方案,也许您应该废弃current_user变量。
答案 2 :(得分:0)
@user = User.find(current_user.id)
有点不必要。主要是因为current_user已经是一个User对象,所以至少应该@user = current_user
,但我建议如果验证框架尚未完成,我会将其添加到应用程序控制器:< / p>
helper_method :current_user
这将使current_user
对象可用于您的视图,并且不需要呈现@user
对象。
为了处理重定向,我通常在我的应用程序控制器中有这个:
before_filter :require_login
def require_login
current_user || redirect_to(root_url)
end
然后在我的控制器中不想重定向:
skip_before_filter :require_login
关于将用户设置为新用户,我不会这样做。我通常喜欢我的User
个对象是用户对象。我只想通过if current_user
测试新用户,其中nil current_user与将其设置为“new”相同。
我希望这会有所帮助