将Marshal加载的字符串转换为对象

时间:2017-01-17 18:04:27

标签: ruby-on-rails ruby

在我的Rails应用程序中,我使用Marshal访问存储在数据库中的会话数据:

<%= Marshal.load(Base64.decode64(session.data)) %>

返回以下字符串:

{"_csrf_token"=>"G/l/RK08vhzy/jMCVfmBRpCQKA5IxiACd1e0pWqMlkA=", "user_id"=>1, "ip_address"=>"127.0.0.1", "browser"=>"Chrome on Macintosh 10.11.5"}

我想要做的是直接访问ip_addressbrowser,以便我可以执行以下操作:

<%= session.data[:ip_address] %>

如何将Marshal.load返回的内容转换为可用对象?

2 个答案:

答案 0 :(得分:1)

这不是一个字符串,它似乎是一个哈希。尝试

<% my_session = Marshal.load(Base64.decode64(session.data)) %>
<%= my_session['ip_address'] %>

答案 1 :(得分:0)

基本上你有一个哈希,而不是一个字符串,因此你可以使用任何Hash methods访问它的键值对。

使用OpenStruct是另一种选择:

require 'ostruct'
h = {"_csrf_token"=>"G/l/RK08vhzy/jMCVfmBRpCQKA5IxiACd1e0pWqMlkA=", "user_id"=>1, "ip_address"=>"127.0.0.1", "browser"=>"Chrome on Macintosh 10.11.5"}
object = OpenStruct.new(h)
object.ip_address
#=> "127.0.0.1"
object.browser
#=> "Chrome on Macintosh 10.11.5"