【问题标题】:Convert Marshal loaded string into object将 Marshal 加载的字符串转换为对象
【发布时间】:2017-01-17 18:04:27
【问题描述】:

在我的 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 返回的内容转换为可用对象?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      基本上你有一个哈希,而不是一个字符串,因此你可以使用任何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"
      

      【讨论】:

        猜你喜欢
        • 2022-01-20
        • 2014-01-14
        • 2011-08-02
        • 2016-06-10
        相关资源
        最近更新 更多