gpt4 book ai didi

ruby-on-rails - 在模型中设置 session 变量

转载 作者:行者123 更新时间:2023-12-03 14:32:57 25 4
gpt4 key购买 nike

使用 Rails 3,如何在模型中设置 session 变量

session[:cannot_reason] = "no such item"

我想在我的用户模型中设置上述内容。现在我收到这个错误:
undefined local variable or method `session' for #<User:0x00000102eb9c38>

想法?谢谢

最佳答案

关于模型是否应该访问 session 数据,有一些不必要的 cargo 崇拜。我认为这很愚蠢,因为 session 实际上只是另一种形式的持久性存储(尽管时间范围要短得多),而且在 Rails 中,让域对象也能够自身持久化似乎没问题。

话虽如此,但不是很干净的方法是将 session 哈希作为参数传递给将对其进行操作的 User 方法:

class User < ...
def mymethod(session, count)
session[:count] = count
end
end

在您的 Controller 中,您将执行以下操作:
def update
# ...
user.mymethod(session, count)
end

想象一下 mymethod正在实现一些业务逻辑,这将修改 session适本地散列。您不必通过 session散列返回到 Controller ,因为 Ruby 传递对对象的引用(如散列)——对那些引用的对象进行破坏性修改。

一句忠告 : 上面的例子,在我看来,是臭的。这是因为 User是一个 ActiveRecord 模型,它(我假设)持久化到数据库中,我们正在添加使其也持久化到 session cookie 的行为。对我来说,这违反了 SRP,应该避免。

我实现这一点的方法是将 session 存储逻辑提取到一个单独的域对象中,该对象封装了其存在的原因。也许,例如, count不仅仅是一个“计数”,它是用户临时购物车中商品的总数。
class TemporaryCart
def initialize(session)
@session = session
end

def add_item
# ... other item adding logic
@session[:temporary_cart][:num_items] += 1
end
end

现在你的 Controller 看起来像这样:
def update
# ...
TemporaryCart.new(session).add_item
end

如果您发现自己经常使用 session 存储,这将更具启发性,并为一种抽象 session 访问代码的明显方法打开了大门。还要注意,我在 session 哈希中命名了数据(但没有显示这个实现)。我建议您这样做,以免在添加其他数据时踩到自己的脚趾。

关于ruby-on-rails - 在模型中设置 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7216847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com