2015-10-28 2 views
3

Мне нужно отобразить массив Ruby в очень определенном формате для шаблона erb. Это потому, что я использую JQcloud для создания облаков слов с использованием JQuery и, по-видимому, придирчив к форматированию массива.Как отобразить массив Ruby как массив JavaScript в шаблоне ERB

Вот так, что 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, который я включил в это приложение Rails. Here is a link.

ответ

2

Почему бы вам не использовать только 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

Это самый простой способ сделать это. Возможно, вам потребуется добавить «json» в начало файла, если вы не используете Rails. Кроме того, чтобы перейти от строки json к ruby, вы можете сделать JSON.parse (json_string) –

+0

Правильно. json lib потребуется автоматически в Rails, но в противном случае вам потребуется его вручную. – tompave

+0

Так что я уже давно пытался to_json без успеха, но потом понял, что мне нужно преобразовать свой Ruby-массив в массив хэшей и THEN вызвать to_json. Теперь это работает. – FluffyKittens

0

Вы должны создать вспомогательную функцию в приложении/помощниках, которая выполняет нужное поведение. Лучше оставить сложную логику вне поля зрения. Тогда в представлении

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. Вы можете передать оба массива и собрать их в помощнике. Вы можете добавить строки строки в строки. Все возможно

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(',') + ']' 
Смежные вопросы