Передача локальной переменной в JS - Rails другого представления
Есть ли способ захватить / извлечь переменную внутри js между двумя различными представлениями? Сказать, что я индексного просмотра с:
<% foo.each do |foo| %>
<%= link_to 'bar', bar_path %>
<% end %>
Затем в bar я хочу добавить некоторый jQuery к определенному элементу с foo.id селектором:
$('div#<%= foo.id %>').fadeOut(); // I know the interpolation wouldn't work here
Я знаю, что могу передать foo.id в bar с моим путем или отправить его через хэш locals, но как бы я "схватил" его с помощью jQuery?
3 ответов:
Вы можете легко передавать переменные в JS, используя драгоценный камень под названиемgon .
gem "gon"Все, что вам нужно сделать, это добавить этот камень в ваш Gemfile, а затем вы можете вызвать gon внутри любого контроллера, как это:
class PaymentsController < ApplicationController def new ... gon.controller = "payments" gon.action = "new" gon.message = "Hello World!" ... end endИ теперь, на любом javascript (в следующем случае, coffeescript) вы можете:
$ -> # Check if it is the target controller and action if gon? && gon.controller is "payments" && gon.action is "new" alert gon.message
Есть ли способ захватить / извлечь переменную внутри js между двумя различные взгляды
Не обошлось и без взлома.
JS-это клиентская технология, то есть она загружается в браузере, а не на сервере. Это хорошо известно тем, что вызывает так много проблем для разработчиков, пытающихся привязать к динамически именованным объектам, как и то, что вы пытаетесь сделать.
Существует несколько способов решения этой. Я пройдусь по ним для вас:
Класс
В первый способ-использовать более широкий идентификатор, такой как Тип
elementилиclass.В данный момент Вы пытаетесь выбрать
foo.id, что означает, что вам придется каким-то образом передать эти данные непосредственно в JS. Неэффективный.Гораздо лучше было бы использовать что-то вроде этого:
$("a.bar").on("click", function(e){ $(this).fadeOut(); });--
URL
Согласно этому ресурсу, нет встроенных способов вытягивать строки запроса из JS: Как получить значение из параметров GET?
Ты может быть в состоянии сделать что-то вроде этого:
$(document).ready(function(){ foo = window.location.search.substring(1); //Considering you have http://url.com/your/foo/id $("#" + foo).fadeOut(); });--
ERB
Существует последняя альтернатива, хотя это работает только в том случае, если вы не выполняете предварительную компиляцию JS (что, я не уверен, действительно возможно). То есть использовать
ERBнепосредственно в вашем JS, а не то, что вы сделали в вопросе.Хотя это работает для динамических ссылок (таких как пути), я не думаю, что он может извлекать данные из контроллера. Если, конечно, вы не поставите сценарий непосредственно на ваш взгляд - что идет вразрез с конвенциями MVC.
#app/views/bar/show.html.erb <script> // your code here </script>
Я думаю, что вам нужно создать файл
js.erbи в нем передать переменную, определенную в вашем действии контроллера. Код insdejs.erbбудет выглядеть следующим образом:<% fields_html = render "fields", :entity => @model %> $("#fields-list").html("<%= escape_javascript fields_html %>")Здесь
fields- часть, которую я создал.:entity- это в основном передача значения переменной.@model- переменная, определенная внутри действия контроллера.fields-list- идентификатор поля, которое я хочу загрузить с помощьюjquery.
Comments