在我的视图中使用会话变量

时间:2009-03-17 11:56:04

标签: ruby-on-rails variables

我被告知我不应该在我的视图文件中使用params[:user_id]之类的变量。同一规则是否适用于session变量?

如果没有,那我该怎么办?首先将它分配给实例变量,然后在视图中使用它?这似乎很烦人,因为我必须为我的每一个动作做这件事。我想我可以将这个重复的代码放在一个方法中,该方法会被该类中的所有其他操作调用。

2 个答案:

答案 0 :(得分:7)

此建议来自构成Rails应用程序的不同组件之间“关注点分离”的最佳实践。确定当前用户的最佳位置是在您的控制器中。您可以在此处访问您的参数和/或会话,以确定是否有人通过身份验证插件直接或间接登录。然后,如果您在视图中需要此信息,只需将其存储在@user等变量中,该变量将在视图中自动显示以供显示。这样做,如果您以后更改了身份验证机制,则可以在不触及视图的情况下执行此操作,这可以很好地指示您在应用程序中的不同组件之间实现了良好的分离。

同样回答你问题的第二部分:

  

我想我可以把这个重复   一个被调用的方法中的代码   通过其他所有行动   类。

这可以通过控制器中的:before_filter轻松完成,您可以指向检查身份验证的方法,并创建任何必要的实例变量,以便在控制器中的操作之间共享。

答案 1 :(得分:2)

您肯定希望在每次加载页面时验证params[:user_id]session[:user_id]。如果您的会话被劫持,您可能会将不需要的代码放入您的视图中并允许跨站点脚本攻击。

也就是说,authenticated_system插件中使用的正确方法是引用current_user辅助方法,该方法允许您检索current_user.user_id

此外,如果您在调用数据库时使用user_id,则仍应通过在视图和控制器操作中调用@selected_user = User.find(params[:user_id]并使用@selected_user.id来验证它。

你将获得更多的控制和保护。