为什么在Rails模型中无法访问Session

时间:2014-10-19 07:20:31

标签: ruby-on-rails

我很好奇为什么Rails不在模型中提供会话访问。

所以我读了很多文章却没有说明原因? 有安全问题吗?

2 个答案:

答案 0 :(得分:2)

因为它违反了模型 - 视图 - 控制器模式。会话在请求之间保持信息。请求由控制器处理,视图处理响应。因此,只能在控制器和视图中访问会话。

模型可以使用会话信息,但不能直接访问它。它必须由控制器传递:

# controller
@my_model.do_something_with(session[:data])


# model
def do_something_with(session_data)
  session_data.do_something
end

答案 1 :(得分:2)

我认为这是一个很好的问题,我不明白为什么会被投票。我知道答案,但很难说清楚。我记得自己也面临着类似的困惑。

控制器和视图始终在会话的上下文中,但模型不在。

对于MVC使用的隐喻是汽车。

  • 型号 - 加速踏板
  • 控制器 - 踩下踏板的动作
  • 查看 - 车速表

该模型可能具有属性,例如踏板的位置,即使它在架子上的盒子中也是如此。

@pedal.position = 1

但视图和控制器将始终位于会话的上下文中(由current_user驱动)

放下脚......

@pedal.update(:position, 2)

我们的速度是多少? (整合current_session /公路旅行的所有加速度)

current_session.speed? // = 30mph

询问"谁在开车是有道理的? (CURRENT_USER)"当说"加速!"或者"我们的速度是多少?"

询问"谁在开车是没有意义的?"当看着架子上的汽车零件(模型)时。

但是,如果模型是汽车驾驶员日志,那么您可能希望将会话数据发送到模型以更新日志的属性。

@car.start!(:started_by => current_driver)

总之,控制器和视图始终位于会话的上下文中。总会有人进行行动或观察视线。