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

8
我是 Ruby on Rails 的一名开发者。我正在开发一个网站,允许用户购买某些物品并完成多个步骤的结账过程。我使用 session 对象作为哈希表,在控制器中传递数据到其他操作。
以下是代码示例:
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

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

  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个回答

6

Sessions(会话),如果使用cookie,不是在Ruby中存在的,它们是通过网络来回传输的。您存储数据的session对象并不是您尝试从中读取数据的同一个session对象。而且,在cookie形式下,字符串和符号之间没有区别。使用Hash#symbolize_keys!确保您拥有所需的键,或者只是始终使用字符串键。


0
session[:checkout_data] = {} #initialize all the checkout data as hash

在这里,您正在分配一个普通的哈希而不是ActionDispatch :: Request :: Session(该对象由session方法返回)。

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

0

看起来这取决于你的Rails版本,当我使用4.1.0时,我遇到了同样的问题,但我们旧的系统使用4.0.3,使用符号作为键来检索会话是可以的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接