在 ActionController::Parameters 上强制编码

Force encoding on ActionController::Parameters

我正在尝试保存来自 PayPal 的 IPN 的参数,以便稍后访问它们并用于交叉引用。

将其保存在 paypal_log 列中的简单代码:

@order.paypal_log = params.to_json

工作正常,已投入生产并且仍然工作正常。调查另一个问题的日志,我遇到了以下行:

Completed 500 Internal Server JSON::GeneratorError (source sequence is illegal/malformed utf-8):

它指向的那一行就是上面的params.to_json

环顾四周后我发现force_encoding("ISO-8859-1").encode("UTF-8") (source)

我将行更改为 params.force_encoding("ISO-8859-1").encode("UTF-8").to_json 并且 运行 我的测试出现以下错误:

undefined method `force_encoding' for #<ActionController::Parameters:0x000000073357f0>

这让我想到,出于某种原因,您无法解析整个 params 变量,只能解析一个散列。任何可能的强制编码所有参数的解决方案?

可以遍历每个参数并强制编码。

params.each { |k, v| params[k] = v.force_encoding('ISO-8859-1').encode('UTF-8') }