如何在ERB模板

时间:2015-10-28 02:39:46

标签: ruby-on-rails ruby ruby-on-rails-4 erb

我需要为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

3 个答案:

答案 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(',') + ']'