我有一个Openstruct对象:
[#<OpenStruct date="20150602", pageviews="46">, #<OpenStruct date="20150603", pageviews="44">]
在我看来,我需要以一种格式呈现用于图表,所以像[["20150602", 46], ["20150603", 44]]
在我看来,我可以通过以下方式实现这一目标:
-@visits.map do |v|
="[#{v.date}, #{v.pageviews}],"
它运作得很好。但是我想在控制器中使用它,所以我不需要视图中的所有代码,我只需将其插入到数据中即可。
所以我在控制器中尝试这一行:
@visits_mapped = @visits.map {|v| "[#{v.date}, #{v.pageviews}],"}
但是,当我在视图中打印@visits_mapped
时,现在添加了一大堆引号,原因并非明显:
["[20150602, 46],", "[20150603, 44],"]
为什么视图和控制器之间的行为会发生变化?如果这是一个愚蠢的问题,请原谅我......
答案 0 :(得分:1)
行为没有改变。在视图中,您只是没有看到地图的输出。 Map迭代数组的成员并生成一个包含迭代结果的新数组。
在视图中,您将获得“预期”,因为您丢弃了地图的最终结果,而是显示每次迭代的结果。由于它们之间没有显示任何内容,因此视图中的输出“看起来”正确(但应该缺少外部数组[]并且应该在最后一个元素之后有一个额外的数据)。如果将映射更改为每个映射,则可以在视图中获得相同的结果(由于它不会生成结果数组,因此应该更高效)。所以在视图中:
-@visits.each do |v|
="[#{v.date}, #{v.pageviews}],"
或在控制器中:
@visits_mapped = @visits.map{ |v| [ v.date, v.pageviews ] }
答案 1 :(得分:1)
我95%确定你只是在做一个非常迂回的尝试来生成JSON。要生成JSON,您应始终使用to_json
。
visits = [ OpenStruct.new(date: "20150602", pageviews: "46"),
OpenStruct.new(date: "20150603", pageviews: "44") ]
# Convert the array of OpenStructs to an array of two-element arrays,
# converting `pageviews` to an integer while we're at it
@visits_mapped = visits.map {|visit| [ visit.date, visit.pageviews.to_i ] }
puts @visits_mapped.to_json
# => [["20150602",46],["20150603",44]]
您的上述评论表明您希望输出位于data-visits
属性中,您可以在Haml中方便地执行此操作:
#chart_div{ data: { visits: @visits_mapped.to_json } }
该模板将评估为以下HTML:
<div data-visits='[["20150602",46],["20150603",44]]' id='chart_div'></div>