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

Sta*_*rsh 6 hash session ruby-on-rails

我在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
Run Code Online (Sandbox Code Playgroud)

所以我使用Items模型在表单的第一个POST请求中创建了一些数据.让我们转到用户输入结算信息的下一页.

  def billing_info
    if request.get?
      @items_to_purchase = session[:checkout_data][:items_to_purchase]
    end
    if request.post?
      # ...
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我的问题就在于此

@items_to_purchase = session[:checkout_data][:items_to_purchase]. 
Run Code Online (Sandbox Code Playgroud)

密钥:items_to_purchase不存在,而是'items_to_purchase'密钥.发生了什么?我特意将该键初始化为符号而不是字符串!Ruby改变了我的背后!如果我只有一个平面哈希,它似乎不会这样做,但是使用这些嵌套哈希,会出现此问题.

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

Ama*_*dan 6

如果您正在使用cookie,那么会话不会存在于Ruby中 - 它们会在网络中来回传输.在session你存储在数据对象是不一样的session,你想从阅读对象.而在cookie形式中,字符串和符号之间没有区别.用于Hash#symbolize_keys!确保您拥有所需的密钥,或者只是始终使用字符串密钥.