【问题标题】:What is the type of this string and how to convert it to hash?该字符串的类型是什么以及如何将其转换为哈希?
【发布时间】:2021-11-11 15:25:28
【问题描述】:

我将 ransack 参数从一个页面传递到另一个页面。最初的 params 看起来像 hash

{"processed_at_gteq_datetime"=>"2021-08-01", "processed_at_lteq_datetime"=>"2021-09-14", "status_eq"=>"processed"}

但是这个参数发送到另一个页面后,它变成了一个字符串,并采用以下类型:

"{\"processed_at_gteq_datetime\"=>\"2021-08-01\", \"processed_at_lteq_datetime\"=>\"2021-09-14\", \"status_eq\"=>\"processed\"}"

在这种形式下,我无法使用它们进行搜索。

我如何转换这个字符串:

"{\"processed_at_gteq_datetime\"=>\"2021-08-01\", \"processed_at_lteq_datetime\"=>\"2021-09-14\", \"status_eq\"=>\"processed\"}"

散列?

我试过了

JSON.parse my_params

但它不适用于此字符串

JSON::ParserError Exception: 767: unexpected token at '{"processed_at_gteq_datetime"=>"2021-08-01", "processed_at_lteq_datetime"=>"2021-09-14", "status_eq"=>"processed"}'

【问题讨论】:

  • 您是如何“将这些参数发送到另一个页面”的?
  • 解决这个问题的正确方法不是尝试解析 Ruby 代码,而是首先找出数据被破坏的原因。#

标签: ruby-on-rails json ruby


【解决方案1】:

我猜你正在使用链接或重定向在页面之间传递参数。

如果你想保留这些参数,你必须将它们传递给路径助手:

link_to other_page_path(ransack_hash)
# => /other_page?processed_at_gteq_datetime=2021-08-01&processed_at_lteq_datetime=2021-09-14&status_eq=processed

和类似的结构。这个

link_to other_page_path(q: ransack_hash)
# => /other_page?q[processed_at_gteq_datetime]=2021-08-01&q[processed_at_lteq_datetime]=2021-09-14&q[status_eq]=processed

将嵌套参数,以便您可以在另一个控制器中检索

ransack_params = params[:q]

【讨论】:

    【解决方案2】:

    这不起作用的原因:

    JSON.parse("{\"foo\"=>\"bar\"}")
    

    是因为它不是有效的 Json。对于有效的 JSON,您需要将 ruby​​ => 运算符替换为 javascript : 运算符。您可以通过 ruby​​ 字符串操作来做到这一点。

    string = "{\"foo\"=>\"bar\"}"
    json = string.gsub(/=>/,':')
    JSON.parse(json)
    

    【讨论】:

    • 这会中断,例如,string = '{"foo"=>"this is an arrow => that is part of the data, not the structure"}'
    猜你喜欢
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多