我很好奇为什么Rails不在模型中提供会话访问。
所以我读了很多文章却没有说明原因? 有安全问题吗?
答案 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)
总之,控制器和视图始终位于会话的上下文中。总会有人进行行动或观察视线。