使用Rails 3,如何在模型中设置会话变量
session[:cannot_reason] = "no such item"
undefined local variable or method `session' for #<User:0x00000102eb9c38>
想法?谢谢
解决方法
有关模型是否可以访问会话数据的不必要的货物培训.我认为这是愚蠢的,因为会话真的只是另一种形式的持久性存储(尽管时间要短得多),而在Rails中,让您的域对象也能够坚持自己就好了.
话虽这么说,不太干净的方法是将会话哈希作为一个参数传递给将在其上运行的User方法:
class User < ... def mymethod(session,count) session[:count] = count end end
在你的控制器中,你会做一些类似的事情:
def update # ... user.mymethod(session,count) end
想象我的方法是实现一些业务逻辑,这将适当地修改会话哈希.您不必将会话哈希传回控制器,因为Ruby传递对对象的引用(如Hash) – 对这些引用的对象进行了修改.
一个忠告:上面的例子在我看来是臭的.这是因为用户是一个ActiveRecord模型(我假设)持续到一个数据库,我们正在添加使它也持续到会话cookie的行为.对我来说,这违反了SRP,应该避免.
我将实现这一点的方式是将会话存储逻辑提取到一个单独的域对象,其中包含其存在的原因.也许,例如,count不仅仅是一个“count”,它是用户临时购物车中的项目总数.
class TemporaryCart def initialize(session) @session = session end def add_item # ... other item adding logic @session[:temporary_cart][:num_items] += 1 end end
现在你的控制器看起来像这样:
def update # ... TemporaryCart.new(session).add_item end
如果您发现自己使用会话存储很多,这是一个更加显而易见的开放门,可以通过一个明显的方式来抽出会话访问代码.还要注意,我命名了会话哈希中的数据(但没有显示此实现).我建议你这样做,所以你不要踩你自己的脚趾添加其他数据.