2010-07-14 211 views
0

我在整个应用程序中都有语句,如@user = User.find(current_user.id)优雅地转义错误

有时用户可能会输入一个零变量(例如current_user为零的新用户)。

我敢肯定,这样做将是散射哑方式,如果喜欢到处发言...

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

@user = User.find(current_user.id)有点不必要。这主要是因为CURRENT_USER是一个User对象了,所以至少是你应该做的@user = current_user,但我会建议,如果尚未通过认证框架完成后,我将它添加到你的应用程序控制器:

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来测试新用户,其中无current_user与将其设置为'new'相同。

我希望这有助于

+0

太棒了!谢谢Geoff。 – sscirrus 2010-07-15 18:49:15

0

假设您使用的语言是面向对象的,我会创建一个保存当前用户上下文的对象。默认情况下,您可以为访问非常有限的未知用户使用CurrentUserContext实例。

当用户登录时,可以将所有用户信息和安全信息加载到CurrentUserContext的新实例中。

这只是一个粗略的想法,但也许有帮助。

编辑:这种方式你不需要创建所有类型的安全异常规则......你只是假定当前上下文实例的安全设置和适当的应用程序行为。

+0

您可以找到连接到问题的标记语言,在这种情况下,Ruby on Rails的。非常感谢您的回答。 – sscirrus 2010-07-15 18:47:56

0

要获得尼尔斯在没有当前用户:

@user = current_user && User.find(current_user.id)

要获得 “新” 在没有当前用户:

@user = current_user ? User.find(current_user.id) : 'new'

无论真正解决问题,但现在至少它在一条线上。对于更一般的解决方案,也许你应该取消current_user变量。