Подтвердить что ты не робот

Как передать переменную javascript в код erb в представлении js?

У меня есть этот Javascript-просмотр в моем проекте Rails 3:

приложение/просмотров/расходы/new_daily.js.erb

var i = parseInt($('#daily').attr('data-num')) + 1;
//$('#daily').append('agrego fila ' + i + ' <br />');

$('#daily').append('<%= escape_javascript(render(partial: 'new_expense', locals: { i: i })) %>');

$('#daily').attr('data-num', i);

Я хочу передать свою переменную i-i для частичного ruby ​​через локали, как я могу это сделать?

4b9b3361

Ответ 1

Насколько я знаю, нет никакого способа сделать это напрямую, и причина довольно проста тоже, html выполняется на стороне сервера, а javascript - это язык на стороне клиента, что означает его выполнение в вашем локальном браузере, вот почему вы даже пытаетесь передать переменную между двумя, вы должны будете сделать запрос на сервер, Однако эта проблема решена путем вызова запроса AJAX, этот запрос AJAX делает то же самое, что и отправку нового запроса на сервер, однако он делает это без обновления или перезагрузки страницы, что дает пользователям иллюзию, что запрос не был сделан.

парень задает аналогичный вопрос Здесь

, и вы можете узнать больше о AJAX Здесь:

Ответ 2

Да вы можете передать значение с помощью jquery;

<%=f.text_field :email ,:id=>"email_field" %>

<script type="text/javascript">
   var my_email= "[email protected]"
   $(document).ready(function(){
        $("#email_field").val(my_email);
   });
</script>

Ответ 3

Простой ответ: вы не можете. Частицы расширены на стороне сервера, а переменные JavaScript устанавливаются позже на стороне клиента. Вы можете сделать i (как имя переменной) параметр частичного и использовать его там.

render :partial => 'xx', :locals => { :variable => 'i' }

И в частичном

alert(<%= variable %>);

Ответ 6

Лучшие другие ответы здесь правильны, что это невозможно сделать, передав переменную 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 и заменять его на странице вместо того, чтобы просто получать атрибут data, делать математику и устанавливать это? Ответ заключается в том, что это лучший и, возможно, единственный способ сделать что-то, что действительно необходимо при рендеринге частичного Rails с использованием UJS при обработке асинхронного ответа на действие.

Если вы обрабатываете асинхронный ответ с вашего сервера в шаблоне create.js.erb, то ваши переменные (например, @), например, не будут отражать работу, выполненную после завершения запроса (например, если есть были обработаны на фоновом сервере, таком как Sidekiq). В этом случае у вас нет актуальных переменных ответа на действие, которые передаются в ваш Rails-фрагмент в файле js.erb, но вы также не можете передать ответ javascript data в ваш частичный, как указано в этот вопрос.

Насколько я знаю, этот подход является единственным способом получить полностью обновленное частичное после получения ответа на асинхронный ответ (не показан). Это даст вам последнюю часть, позволяющую вам получить свой javascript, и достаточно гибкая, чтобы работать практически в любом случае.

Ответ 7

Пусть мы понимаем друг друга. Ваш шаблон erb (new_daily.js.erb) будет обработан на стороне сервера, будет оценен код ruby ​​(в пределах <% %>), сделана подстановка, а затем полученный javascript будет отправлен в браузер. На стороне клиента браузер затем оценит этот код javascript, а переменной i будет присвоено значение.
Теперь, когда вы хотите передать эту переменную и какой частичный?

Ответ 8

1) Вы можете создать тег js с глобальной переменной в шаблоне erb, после чего вы сможете получить доступ к этой переменной из любого js файла

<%= javascript_tag do %>
   window.productsURL = '<%= j products_url %>';
<% end %>

2) Вы можете передавать данные в атрибут данных в шаблон erb и обращаться к нему с помощью js на стороне клиента $('#products').data('products')

<%= content_tag "div", id: "products", data: {products: Product.limit(10)} do %>
   Loading products...
<% end %>

3) Вы можете использовать gon, чтобы использовать переменные Rails в js

Есть хорошая статья, прочитайте ее и прекрасное решение для вашего конкретного случая http://railscasts.com/episodes/324-passing-data-to-javascript, больше комментариев здесь http://railscasts.com/episodes/324-passing-data-to-javascript?view=asciicast