Лучшие ответы здесь верны, что этого нельзя сделать, передав переменную javascript в партиал erb, поскольку он отображается на сервере, а не на клиенте.
Но поскольку любой, кто ищет это, вероятно, заинтересован в обходном решении, которого я здесь не вижу, я опубликую этот пример, который хорошо работает с Rails UJS и Turbolinks.
Во-первых, вы настроили свой контроллер на возврат части в виде HTML:
format.html { render partial: "new_expense" }
Затем напишите функцию JavaScript AJAX в app/views/expenses/new_daily.js.erb
:
var i = parseInt($('#daily').attr('data-num')) + 1;
$.ajax({
url: '/daily',
type: 'GET',
dataType: 'html',
contentType: "application/html",
success: function(response) {
$('#daily').replaceWith(response)
$('#daily').attr('data-num', i);
}
});
Это позволит получить частичку вашего Rails в виде фрагмента html, который вы можете использовать для замены этой части отображаемой страницы. Вы можете использовать jQuery, чтобы получить значение data-num
атрибута, выполнить некоторые математические расчеты, заменить частичное в своем представлении, а затем снова установить значение атрибута.
Вы можете спросить, зачем идти на все, чтобы получить частичку Rails и заменить ее на странице, вместо того, чтобы просто получить атрибут данных, выполнить математические расчеты и установить его? Ответ заключается в том, что это лучший и, пожалуй, единственный способ сделать что-то, что действительно необходимо при частичной визуализации Rails с использованием UJS при обработке асинхронного ответа на действие.
Если вы обрабатываете асинхронный ответ от вашего сервера в шаблоне create.js.erb
, то ваши переменные (например, @daily) не будут отражать работу, выполненную после завершения запроса (например, если имеется обрабатывал на фоновом сервере, как Sidekiq). В этом случае у вас нет актуальных переменных ответов действия для передачи в ваш партиал Rails в файле js.erb
, но вы также не можете передать ответ javascript data
в свой партиал, как указано в этот вопрос.
Насколько я знаю, этот подход является единственным способом получить полностью обновленную частичку после получения ответа на асинхронный ответ (не показан). Это дает вам современную частичную версию, позволяет включать в нее ваш javascript и достаточно гибок, чтобы работать практически во всех случаях использования.