2015-09-22 2 views
4

Я пытаюсь передать переменную в метод. Вот пример:Есть ли способ передать переменную javascript в ruby-метод в html.erb

<script> 
    var b = 1 
    var c = "string" + "<%= method.a(b).to_s%>" 
</script> 

который не работает.

Это работает:

<% @b = 1%> 
<script> 
    var c = "string" + "<%= method.a(@b).to_s%>" 
</script> 

Любые идеи будут оценены.

+0

возможно дубликат: http://stackoverflow.com/questions/4959770/how-to-pass-a-javascript-variable-into-a -erb-code-in-a-js-view –

+0

Я не хочу закрывать как дубликат этого вопроса только для «принятого» ответа:} Может быть, другой? http://stackoverflow.com/questions/14080154/how-to-use-a-javascript-variable-in-erb-code-in-rails?lq=1, http://stackoverflow.com/questions/5655096/ send-javascript-variables-to-rails? lq = 1 – user2864740

ответ

0

Вы не можете оценить переменную JavaScript внутри вашего метода Ruby. Кроме того, ваш текущий скрипт должен находиться за пределами конвейера активов, что обычно является плохой практикой.

Одним простым решением является передача переменной в качестве атрибута данных. Вы запустите свой метод, а затем передадите результат с помощью jQuery после загрузки DOM. Это позволяет сохранить JavaScript в конвейере активов и передать его данные, оцененные сервером Ruby.

Примечание: @b должен быть определен на контроллере:

<div id="foo" data-bar="<%= method.a(@b).to_s %>"></div> 

<script> 
    $(document).ready(function() { 
    var b = $(#foo).data('bar'); 
    var c = "string" + b; 
    }); 
</script> 

Другой вариант, чтобы сделать ваш скрипт асинхронно с unobtrusive JavaScript в Rails.

0

Рубиновый код выполняется на сервере, в то время как Javascript выполняется браузером клиента.

рубин код отмечен <%= %> выполняется на сервере и затем доставляется клиенту, где будет выполняться Javascript код. Вот почему первый фрагмент не работает, пока второй делает: во втором фрагменте <% @b = 1 %> получает оценку до отправляет HTML-запрос.

С учетом сказанного, есть способ сделать то, что вы хотите: use Ajax передать переменную Javascript на сервер, выполнить все, что вам нужно, и отправить ответ клиенту.

1

Этот добрый камень gon для выполнения этой работы. Используя этот драгоценный камень вы можете сделать это:

Внутри контроллера:

gon.push(variable_name: 1) 

Внутри ваши JS файлы, которые вы можете получить эту переменную:

gon.variable_name 

Это работает: JS или: кофе файлы.

+0

gon передает рельсы в js. Но OP хочет передать переменную js в ruby. – vinayawsm

0

Необходимо описать процесс потока лучше.

Случай 1: Значение переменной определяется действием пользователя. Затем сделайте ajax-вызов метода объектов rails, чтобы получить вычисленное значение js.

Дело 2: Значение переменной определяется приложением (на стороне сервера). Тогда вы можете сделать:

<% @b = 1%> 
<script> 
    var b = <%= @b %>; 
    var c = "string" + "<%= method.a(@b).to_s%>"; 
</script> 

Такое же значение будет доступно JS и серверному методу. Но это не чистый подход. Вид не должен устанавливать значение.

А также, держать JS в трубопроводе активов как это было предложено @ jeffD23