优雅地逃避错误

时间:2010-07-14 21:06:39

标签: ruby-on-rails variables if-statement null

我的申请表中有@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

处理这种困惑的优雅方法是什么?

3 个答案:

答案 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”相同。

我希望这会有所帮助