我需要为erb模板以非常特定的格式呈现Ruby数组。这是因为我使用JQcloud使用JQuery构建单词云,并且显然对数组格式化很挑剔。
以下是JQcloud需要格式化JS数组的方式:
var word_array = [
{text: "Lorem", weight: 15},
{text: "Ipsum", weight: 9},
{text: "Dolor", weight: 6},
{text: "Sit", weight: 7},
{text: "Amet", weight: 5}
// ...as many words as you want
];
所以我在我的控制器中创建的是两个数组,一个用于构建我的云的单词数组,以及另一个用于每个单词的权重数组。
ruby_word_array = ["Lorem","Ipsum","Dolor","Sit","Amet"]
ruby_weight_array = [15,10,13,8,4]
我需要转换我的两个Ruby数组,使它们能够正确地使用erb进行渲染。到目前为止,我想出了:
var wordArray = <%= raw @word_array.map{|a, i| {text: @word_array[0], weight: 15} } %> # I just hard coded the weight for simplicity
这给了我一些接近但不够接近的东西,最终格式化如下:
var wordArray = [{:text=>"Lorem", :weight=>15}, {:text=>"Ipsum", :weight=>15}]
我真的只需要知道如何修改我的最后一个示例,以Python样式哈希语法{key: "value"},{key_2: "value_2"}
老实说这很棘手,我很难过。我正在使用的库名为JQcloud,它有一个Ruby gem,我已经将其整合到这个Rails应用程序中。 Here is a link
答案 0 :(得分:4)
为什么不使用to_json
?
# in ruby
@array = [{:text=>"Lorem", :weight=>15}, {:text=>"Ipsum", :weight=>15}]
然后,在视图中:
var wordArray = <%= @array.to_json.html_safe %>;
将呈现:
var wordArray = [{"text":"Lorem","weight":15},{"text":"Ipsum","weight":15}];
答案 1 :(得分:0)
您应该在app / helpers中创建一个帮助函数来执行您想要的行为。最好将复杂的逻辑排除在视图之外。然后在视图中
var wordArray = <%= myHelper @word_array %>
在帮助者中
def myHelper(word_array):
string = "["
word_array.each do |word|
string << "{text: \"#{word[:text]}\", weight: #{word[:weight]}},"
string = string.chomp(",") #in case JS hates the last comma
string << "]"
return string
但是,真的,你可以把你想要的东西放在myHelper中。您可以传递两个数组并将它们放在帮助器中。您可以在字符串中添加换行符。一切皆有可能
答案 2 :(得分:0)
在这种2阵列情况下,zip
很有用。
ruby_word_array.zip(ruby_weight_array).map{|word, weight| "{text: #{word}, weight: #{weight}}"}.join(',')
如果您需要[]
,
'[' + ruby_word_array.zip(ruby_weight_array).map{|word, weight| "{text: #{word}, weight: #{weight}}"}.join(',') + ']'