У меня есть приложение, в котором у меня есть массив элементов на моем контроллере. Я хочу передать этот массив в представление Javascript, а затем преобразовать его в JSON и проанализировать его.
Это мой взгляд:
<% content_for :page_meta do %>
<script>
const filterItems = "<%= @filter_options %>";
const productItems = "<%= @mdms_products %>";
</script>
Если я отлаживаю @filter_options. У меня есть это на IRB:
@filter_options.class # => Array
И значение:
[{:name=>"Solution Type", :uid=>"application", :component=>"HierarchicalListFilter", :props=>{:rootUrl=>"/insulation/commercial/enclosure/applications", :rootText=>"Enclosure Solutions"}, :values=>[{:name=>"Walls", :slug=>"walls", :children=>[{:name=>"Framed", :slug=>"framed", :children=>[{:name=>"Steel Stud", :slug=>"steel-stud"}, {:name=>"Wood Stud", :slug=>"wood-stud"}]}, {:name=>"Masonry", :slug=>"masonry", :children=>[{:name=>"Concrete Masonry Unit", :slug=>"concrete-masonry-unit"}]}, {:name=>"Concrete", :slug=>"concrete", :children=>[{:name=>"Precast", :slug=>"precast"}, {:name=>"Tilt-up", :slug=>"tilt-up"}, {:name=>"Cast-in-place", :slug=>"cast-in-place"}]}, {:name=>"Metal Building", :slug=>"metal-building"},
Все выглядит идеально, верно? Но при отладке моей консоли javascript, когда я получаю значение productItems, я получаю эту странную строку:
[{:name=>"Solution Type", :uid=>"application", :component=>"HierarchicalListFilter", :props=>{:rootUrl=>"/insulation/commercial/enclosure/applications", :rootText=>"Enclosure Solutions"}, :values=>[{:name=>"Walls", :slug=>"walls", :children=>[{:name=>"Framed", :slug=>"framed", :children=>[{:name=>"Steel Stud", :slug=>"steel-stud"},
И, конечно же, когда я пытаюсь выполнить JSON.parse(filterItems), он показывает ошибку синтаксического анализа.
Итак, как лучше всего передать массив Ruby в Json в Javascript?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ruby имеет совершенно другую нотацию, чем JavaScript, поэтому вы должны выразить ее в правильной форме и убедиться, что она не экранируется HTML:
<script>
const filterItems = <%= @filter_options.to_json.html_safe %>;
const productItems = <%= @mdms_products.to_json.html_safe %>;
</script>
Может быть проще отобразить все это как JSON и загрузить его через AJAX.
Спасибо @tadman. В этом конкретном случае (у меня есть БОЛЬШОЕ количество данных в моем сеансе, и мне не нужно делать асинхронные вызовы на сервер) это была только проблема синтаксического анализа. Это сработало как заклинание. Спасибо еще раз