У меня есть коллекция, хочу сгенерировать с ее помощью объект javascript

#javascript #ruby-on-rails

#javascript #ruby-on-rails

Вопрос:

У меня есть коллекция:

 @products = Product.where("product_type = ?", 3)
  

Теперь я хочу создать объект javascript, чтобы я мог выполнять поиск в пользовательском интерфейсе, например:

 my_products[2342]
  

и он вернет:

 "some_name"
  

Я считаю, что это должно выглядеть как:

 var my_products = {
     2342: "some_name",
     5321: "there blah"

}
  

Какой хороший способ сгенерировать это в действии моего контроллера?

Ответ №1:

У ActiveRecord и Ruby в целом есть метод to_json , который должен помочь вам сделать то, что вы ищете.

В основном создайте массив, который вы хотите создать в Ruby, и вызовите to_json , чтобы создать строку, которая является допустимым объектом javascript для использования.

Ответ №2:

Я рекомендую использовать to_json, но если вам нужен другой вариант, вы могли бы сгенерировать литеральную нотацию объекта js, используя шаблон js.erb.

просмотры / продукты /products.js.erb

 var products = {
<% @products.each do |product| %>
  <%= "#{product.id}: "#{@product.name}"," %>
<% end %> 
}
  

Затем настройте метод контроллера, используя либо выделенный метод, либо блок respond_to. Наконец, вызовите метод AJAX и выполните возвращенный код, в результате которого вы получите доступ к переменной product, определенной в шаблоне js.erb.

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

1. Будьте осторожны с этим! Вам нужно убедиться, что вы правильно закодировали строку значения (экранируете кавычки), и если в поле name попадет что-либо, кроме целого числа, вам нужно будет заключить поле name в кавычки и также правильно экранировать это.

2. @Brandon Очень хорошее замечание. Я пытался упростить свой пример, чтобы кто-то мог увидеть механику, не теряясь в деталях реализации. Вы всегда должны быть осторожны, когда делаете что-то вручную. Как я уже говорил в начале, я рекомендую использовать using to_json… но мне, вероятно, следует отредактировать свой пост, чтобы сделать это немного более понятным…

3. Достаточно справедливо — я не подразумевал, что вы были неправы, просто пытался добавить к вашему ответу и улучшить взаимосвязи!

4. @Brandon Не беспокойся 🙂 Я знаю, вы не подразумевали, что я был неправ. Я должен был упомянуть подводные камни. Хороший улов с вашей стороны 🙂