Как передать переменную javascript в код erb в представлении js? - PullRequest
28 голосов
/ 10 февраля 2011

У меня есть это представление 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);

Я хочу передать свою переменную javascript 'i' частичке рубина через местных жителей. Как мне это сделать?

Ответы [ 8 ]

22 голосов
/ 10 мая 2011

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

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

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

14 голосов
/ 01 февраля 2013

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

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

<script type="text/javascript">
   var my_email= "my@email.com"
   $(document).ready(function(){
        $("#email_field").val(my_email);
   });
</script>
3 голосов
/ 05 октября 2012

Посмотри на камень. https://github.com/gazay/gon

Он дает вам простой объект, в который вы можете передавать переменные, которые будут доступны вашим сценариям через window.gon

Также упоминается здесь http://railscasts.com/episodes/324-passing-data-to-javascript

3 голосов
/ 10 февраля 2011

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

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

И в частичном

alert(<%= variable %>);
2 голосов
/ 22 июля 2016

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

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

2) Вы можете передать данные в атрибут data в шаблоне 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

2 голосов
/ 12 сентября 2015

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

2 голосов
/ 22 ноября 2011

Вот несколько вариантов, как это сделать:

http://jing.io/t/pass-javascript-variables-to-rails-controller.html

0 голосов
/ 10 февраля 2011

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

...