ruby-on-rails – 在模型中设置会话变量

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在模型中设置会话变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用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

如果您发现自己使用会话存储很多,这是一个更加显而易见的开放门,可以通过一个明显的方式来抽出会话访问代码.还要注意,我命名了会话哈希中的数据(但没有显示此实现).我建议你这样做,所以你不要踩你自己的脚趾添加其他数据.

猜你在找的Ruby相关文章