我正在将一堆ID保存到会话中。
session[:id_group] = 1,2,3,4,5
因为我需要将它们保存到带有表单的数据库中。
在那种形式中我有隐藏字段:
<%= form.text_field :group, :value => session[:id_group].inspect%>
我使用inspect来保存到数据库的值为[1,2,3,4,5]而不是12345
问题是,当我从数据库中获取该值时,我将[1,2,3,4,5]作为字符串。 如果我这样做:
groups = game.group
=> [1,2,3,4,5]
group.class
=>string
我可以将它转换为这样的数组:
groups = game.group.split(',')
但是如果我这样做的话
groups.each |group| do
puts |group|.to_s
end
我明白了
[1
2
3
4
5]
我需要干净的ID,所以我可以做像
这样的事情
but then if I do
groups.each |id| do
User.find_by_id(id)
end
我该如何解决这个烂摊子? 提前谢谢。
答案 0 :(得分:2)
您不应该使用inspect对您的值进行编码。这将被重新编码为文字字符串,这可能不是你的意图。
在表单中放置内容的正确方法是执行与解码方式相反的操作:
<%= form.text_field :group, :value => session[:id_group].join(',') %>
如果正确匹配了join和split,它将起作用。检查的对应物是eval,你真的不想这样做,因为有人可以用这种方式运行任意代码。
作为一个注释,您还可以使用以下内容加载一堆用户:
@ids = params[:group].split(/,/)
@users = User.find_all_by_id(@ids)
这比一次加载它们要有效得多。
答案 1 :(得分:0)
请参阅:Convert a stringified array back to array
groups.class
#=> String
groups = JSON.parse(groups)
#=> [1,2,3,4,5]
groups.class
#=> Array