如何在Rails 4中将数组存储到cookie中?

5

我想在Rails中存储一个数组,在解码时出现了错误。 我使用cookies[:test] = Array.new进行存储 当我尝试解码时, @test = ActiveSupport::JSON.decode(cookies[:test]) 我遇到了错误。 怎样才能正确地实现我所要的功能呢?

3个回答

6
“Rails的做法”是使用JSON.generate(array),因为这是Cookies文档中第二个例子中使用的方法。
# Cookie values are String based. Other data types need to be serialized.
cookies[:lat_lon] = JSON.generate([47.68, -122.37])

来源: http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html

当您想要读取它时,只需使用JSON.parse cookies [:lat_lon],它将为您提供一个数组。


5

当写入cookie时,我通常会将数组转换为字符串。

def save_options(options)
  cookies[:options] = (options.class == Array) ? options.join(',') : ''
end

当读取 cookie 时,我会将其转换回数组。

def options_array
  cookies[:options] ? cookies[:options].split(",") : []
end

我不确定这是否是“正确的方法”,但对我来说效果很好。

1
显然要注意存储包含逗号的值。 - AlexQueue
非常正确。在这种情况下,我控制所有的键和值,因为它们是应用程序特定的设置(例如ShowDetails,TRUE)。当然,如果您愿意,您也可以将分隔符更改为更安全的内容。 - Stenerson

-5
请使用session而不是cookies。您不必对其进行解码,rails会为您处理。创建会话的方法与您已经使用的方式相同:
session[:test] = Array.new

当你需要时,像平常一样访问它

session[:test]
# => []

6
这怎么可能是正确答案,它甚至都没有尝试回答如何将一个数组存储在cookie中的问题? - sevenseacat
@sevenseaca - 会话确实将数组存储在cookie中。 - lightswitch05
以非常非常有限的方式(如果您使用Rails cookie存储会话),并且您无法在其中设置任何正常cookie选项。 - sevenseacat
1
Cookies和session是为不同目的而设计的不同东西(尽管通常相似)。这回答了错误的问题。 - AlexQueue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接