Передача локальной переменной в 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?

499   3  

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 и в нем передать переменную, определенную в вашем действии контроллера. Код insde js.erb будет выглядеть следующим образом:

<% fields_html = render "fields", :entity => @model %>
$("#fields-list").html("<%= escape_javascript fields_html %>") 

Здесь fields - часть, которую я создал. :entity - это в основном передача значения переменной. @model - переменная, определенная внутри действия контроллера. fields-list - идентификатор поля, которое я хочу загрузить с помощью jquery.

Comments

    Ничего не найдено.