Как встроить динамический код Ruby в раздел javascript в шаблонах Slim?

В одну сторону:

javascript_tag do
  == "var all_product_ids = #{existing_ids.to_json};"
  == "var products_json   = #{@filter.data.to_json};"

or:

= %Q{
var all_product_ids = #{existing_ids.to_json};
var products_json   = #{@filter.data.to_json};
}

есть ли лучшие решения для этого?


person wkang    schedule 13.04.2011    source источник


Ответы (6)


что я предпочитаю делать, так это хранить весь javascript в отдельном файле.

например, я бы сделал это следующим образом (jquery):

в вашем макете:

...

<body data-product-ids="<%= existing_ids.to_json %>"
      data-products-json="<%= @filter.data.to_json %>">

.. in js:

// create your application namespace
$.myapp = {};
$.myapp.allProductIds = $.parseJSON( $('body').attr('data-product-ids') );
$.myapp.products = $.parseJSON( $('body').attr('data-products-json') );

Итак, вы будете использовать его в js следующим образом:

$.myapp.allProductIds
person Vlad Khomich    schedule 13.04.2011
comment
Благодарю вас! Но когда вам нужна только одна или две строки js-кода, вы все равно будете использовать отдельный файл? - person wkang; 16.04.2011
comment
Ну, да, это просто вопрос наилучшей практики. Но тем не менее, это делает ваш код более надежным и лучше структурированным. - person Vlad Khomich; 18.04.2011
comment
Почему это принятый ответ, когда это ответ ERB/jQuery на конкретный вопрос slim/javascript... - person Matthew; 01.07.2019

в тонком

javascript:
  var all_product_ids = "#{existing_ids.to_json}";
  var products_json   = "#{@filter.data.to_json}";
person stonean    schedule 24.07.2011

Из https://github.com/slim-template/slim Абзац интерполяции текста

SLIM экранирует HTML по умолчанию. Чтобы избежать того же, используйте #{{content}} для #{content}.

person Karthik M    schedule 28.10.2013

У меня была аналогичная проблема с этим. Использование кода, который предоставили другие, у меня не сработало, потому что тонкий html экранировал мою переменную. В итоге я использовал Gon. Это для Sinatra, но у них есть жемчужина и для Rails. Надеюсь, это поможет другим, имеющим аналогичные проблемы.

person Marvin Alejandro Herrera    schedule 07.02.2013

сначала создайте _your_erb_file_contain_javascript_code.erb

И затем в вашем тонком файле javascript: часть:

#{ conditions ? (render 'your_erb_file_contain_javascript_code') : nil}
person Lane    schedule 14.02.2015

person    schedule
comment
будьте осторожны с атакой </script> - person lidaobing; 14.06.2013
comment
проверьте Rails API для метода sanitize - person draw; 28.01.2014