如何在 ERB 模板中将 Ruby 数组呈现为 JavaScript 数组
how to render Ruby array as JavaScript array in ERB template
我需要以非常特定的格式为 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.
您应该在 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 中放入任何您想要的东西。您可以传递两个数组并将它们放在帮助程序中。您可以在字符串中添加换行符。一切皆有可能
你为什么不直接使用 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}];
在这样的 2 Arrays 情况下,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(',') + ']'
我需要以非常特定的格式为 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.
您应该在 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 中放入任何您想要的东西。您可以传递两个数组并将它们放在帮助程序中。您可以在字符串中添加换行符。一切皆有可能
你为什么不直接使用 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}];
在这样的 2 Arrays 情况下,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(',') + ']'