我在Ruby on Rails中遇到了一些奇怪的东西。我正在开发一个网站,允许用户购买某些东西并进行多步结算流程。我使用会话对象作为哈希来将数据传递给控制器中的其他动作。
这里基本上是什么样的
class CheckoutController < ApplicationController
def index
#stuff
end
def create
#stuff
session[:checkout_data] = {} #initialize all the checkout data as hash
# Insert the :items_to_purchase key with the value as a new Items model instance
session[:checkout_data][:items_to_purchase] = Items.new(post_data_params) #as an example
redirect_to :action => 'billing_info'
end
所以我使用Items
模型在表单的第一个POST请求中创建了一些数据。让我们转到用户输入结算信息的下一页。
def billing_info
if request.get?
@items_to_purchase = session[:checkout_data][:items_to_purchase]
end
if request.post?
# ...
end
end
end
我的问题在线
@items_to_purchase = session[:checkout_data][:items_to_purchase].
密钥:items_to_purchase
不存在,而'items_to_purchase'
是密钥。发生了什么?我特意将该键初始化为符号而不是字符串! Ruby改变了我的背后!如果我只有一个平面哈希,它似乎没有这样做,但是使用这些嵌套哈希,会出现这个问题。
有人对正在发生的事情有任何见解吗?
答案 0 :(得分:6)
会话,如果你正在使用cookie,不要生活在Ruby中 - 它们是通过网络来回传输的。您存储数据的session
对象与您尝试从中读取的session
对象不同。而在cookie形式中,字符串和符号之间没有区别。使用Hash#symbolize_keys!
确保您拥有所需的密钥,或者只使用字符串密钥。
答案 1 :(得分:0)
session[:checkout_data] = {} #initialize all the checkout data as hash
你在这里分配一个普通的Hash而不是ActionDispatch :: Request :: Session(该对象由session方法返回)。
答案 2 :(得分:0)
我今天遇到了这个问题。以下是我能够解决的问题......希望这有帮助!
def first_method
session[:thing_to_store] = ThingToStore.new(params)).to_yaml
end
def second_method
session[:thing_to_store] = YAML.load(session[:thing_to_store])
end
答案 3 :(得分:0)
这似乎取决于您的rails版本,当我使用4.1.0时,我遇到了同样的问题,但我们的旧系统使用4.0.3,使用符号作为检索会话的密钥。