Ruby 2.7中使用CGI::Cookie.parse如何正确获取Cookie值
问题原因
这是Ruby 2.7版本标准库CGI::Cookie的已知实现bug:该类继承自Array,2.7版本中#value方法的实现错误直接返回了对象本身,和官方文档描述的行为不符。
正确获取Cookie值的方法
你可以用以下几种方式在仅依赖标准库的前提下拿到解码后的Cookie值:
单值Cookie场景(绝大多数情况)
直接取数组第一个元素再做URL解码即可:
require 'cgi' require 'uri' c = CGI::Cookie.parse('test=%66%6f%6f')['test'] cookie_value = URI.decode_www_form_component(c[0]) p cookie_value # => "foo"
也可以直接调用to_s方法后解码,效果一致:
cookie_value = URI.decode_www_form_component(c.to_s)
多值Cookie场景(同个Cookie Key对应多个值)
遍历整个数组逐个解码即可:
cookie_values = c.map { |item| URI.decode_www_form_component(item) }
补充说明
该bug在Ruby 3.0及以上版本已经被修复,#value方法可以正常返回Cookie值数组。
内容的提问来源于stack exchange,提问作者iBug
相关产品推荐
相关产品推荐

