Ruby on Rails偷偷地将嵌套的哈希键从符号更改为字符串

时间:2014-05-07 23:15:26

标签: ruby-on-rails session hash

我在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改变了我的背后!如果我只有一个平面哈希,它似乎没有这样做,但是使用这些嵌套哈希,会出现这个问题。

有人对正在发生的事情有任何见解吗?

4 个答案:

答案 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,使用符号作为检索会话的密钥。