Проблема с Javascript Rails JSON

#ruby-on-rails #ruby #json

#ruby-on-rails #ruby #json

Вопрос:

У меня есть большой json от моего контроллера rails:

 @json = {:Nodes => @nodes.as_json(:only => [:ID, :Lat, :Lon])}
  

и я хочу использовать это в своем javascript в своих представлениях. В более широком масштабе я хочу использовать json для извлечения широты и lon для отображения на карте Google. Однако, прямо сейчас, я просто пытаюсь посмотреть, смогу ли я получить все точки должным образом. Мой вопрос в том:

Какой хороший способ проанализировать json в файле javascript? (Примечание: расширение файла по-прежнему остается html.erb) Я пытался:

 var stuff = eval('('   <%= @json %>   ')'); 
  

но, похоже, это не работает. Кто-нибудь может помочь? Большое спасибо!

Комментарии:

1. Я использовал firebug, и он говорит, что есть неожиданный токен : но разве это не должно быть частью JSOn в любом случае?

2. Не могли бы вы, пожалуйста, опубликовать соответствующие части вашего контроллера, html и js-файлов?

3. Конечно, Бехранг! Моя функция контроллера выглядит следующим образом: def map @nodes = Node.all @json = {«Nodes» => @nodes.as_json(:only => [:ID, :Lat, :Lon])} end и мой html-файл просто выглядит следующим образом: <!DOCTYPE html> <html> <head> <script type=»text / javascript»> var stuff = <%= @json%>; var json = JSON.parse(stuff); alert («текст «); </script> </body> </html> Есть идеи? Класс Node просто содержит узлы с идентификаторами Lat и Lon вместе с другой информацией, которую я не включаю, используя символ :include

4. Не могли бы вы отредактировать свой пост, чтобы включить свой контроллер и просмотреть исходный код? (кстати, я полагаю, вы можете использовать обратный тик для pre within a comment )

Ответ №1:

Поскольку JSON на самом деле является полностью допустимым синтаксисом javascript, я часто делаю это:

 var stuff = <%= @json_hash.to_json %>;
  

Самая простая вещь, которая могла бы сработать. Если вы получаете свой JSON из ненадежного источника, лучше использовать библиотечную функцию для его синтаксического анализа, что предотвратит выполнение кода. Кроме того, обязательно вызовите to_json свой окончательный хэш. Вы не хотите использовать только to_s это, что используется по умолчанию в erb .

Комментарии:

1. Итак, я вызываю метод to_json, хотя я вызвал метод as_json в контроллере? Я попробовал это, и это выдало мне неожиданный токен { ошибка. Я так запутался. Если бы вы могли оказать мне дополнительную помощь, это было бы здорово!

2. Я также проверил JSLint, чтобы убедиться, что мой JSON действителен, и попробовал JSONParse … что не так!?! =(

3. Я считаю, что as_json просто возвращает хэш, который подходит для вызова to_json . Вы можете попробовать это в rails console , чтобы увидеть, что это делает. Я не понимаю, что вы говорите о JSLint. Если у вас есть допустимая строка JSON, просто поместите ее в документ после var объявления.

4. Привет, Остин, извините за путаницу. Я только что отрендерил свой json и поместил его в JSONLint, который проверяет, является ли он допустимым, и он проверяется, поэтому я не понимаю, почему он не выполняется корректно в javascript. Есть идеи?

5. Можете ли вы опубликовать некоторое представление выходных данных JSON и точное сообщение об ошибке, которое вы получаете?

Ответ №2:

 @json = {:Nodes => @nodes.map({|n| [n[:ID], n[:Lat], n[:Lon]] })}.to_json
  

используя prototype, вы могли бы сделать это:

 var stuff = '<%= raw @json %>'.evalJSON();
  

или с помощью jquery:

 var stuff = jQuery.parseJSON('<%= raw @json %>');
  

Ответ №3:

В Rails 4 все эти решения не работают для меня, поэтому я делаю это:

 var consumers;
consumers = <%= @consumers.to_json.html_safe %>;
  

Итак, consumers[0] сгенерируйте Object (model Rails), вы можете выполнять итерации для преобразования в ваших объектах, таких как:

 function consumersRubyToJavascriptArray(json){
    for (var i = 0; i< json.length; i  ) {
        consumers.push(new Consumer({ id: json[i][0], name: json[i][2], phone: json[i][3], cpf: json[i][4]}));
    }
}