#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 Не беспокойся 🙂 Я знаю, вы не подразумевали, что я был неправ. Я должен был упомянуть подводные камни. Хороший улов с вашей стороны 🙂