Метод JQuery GET Rails контроллер

0

Как работает jQuery .get() с методами Rails? Я создал метод в контроллере documents называется templates и я хотел бы получить доступ к этому методу из JS-метода в отдельном JS файле. Из некоторых исследований я обнаружил, что использование .get() - лучший способ получить доступ к методам Rails, но когда я это делаю, например, var templates = $.get("/documents#templates", function (data) { console.log(data) }, он просто запускает ведение журнала всей структуры /documents HTML/DOM.

Я предполагаю, что мне нужно "захватить" маршрут, если вы это сделаете, но я попытался добавить настраиваемый маршрут, и консольный журнал все еще возвращает HTML-страницу, даже не дойдя до моего контроллера Rails.

Если это помогает (хотя я сомневаюсь, так как удаление этого полностью не изменяет результаты консольного журнала), здесь мой метод templates в контроллере:

def templates
  @templates = DocumentTemplate.all
  @output = []
  @templates.each do |template|
    @output = template.content
  end
  respond_with(@output)
end
  • 1
    Просто заметил, что вам нужно указать URL для первого аргумента $ .get, например, «документы / шаблоны», а не отображение контроллера Rails («документы # шаблоны»). Чтобы найти URL-адрес, запустите в вашей консоли rake routes или укажите путь явно в файле route.rb (например, get 'documents/templates', to: 'documents#templates' ).
  • 0
    Спасибо! Объявление пути в routes.rb плюс метод @Oli's Oli ниже работает отлично.
Теги:
get
ruby-on-rails-3
rails-routing

2 ответа

0
Лучший ответ

Если вы хотите ответить на запрос JQuery GET с фрагментами HTML, вы можете рассмотреть возможность частичного макета (который не будет включать полный макет приложения). В вашем контроллере ответ может выглядеть так:

def templates
  @templates = DocumentTemplate.all

  if request.xhr?
    render :partial => 'templates', locals: {:templates => @templates}
  else
    # respond with your normal layout if required
  end
end

Затем в вашем app/views/documents/ folder создайте частичный файл с именем _templates.html.haml (или.erb). Обратите внимание на ведущее подчеркивание в частичных именах.

У вас будет доступ к локальной переменной templates чтобы зациклиться в вашем частичном файле (синтаксис здесь для HAML):

- templates.each do |template|
   # do what required to present each template instance here

Затем ваш запрос JQuery GET должен получить только частичные фрагменты HTML:

$.get("/documents/templates", function(data) {
  console.log('data');
  alert("Load was performed.");
});
  • 0
    Извините за задержку с ответом, но большое спасибо за объяснение. Имеет смысл то, что вы объяснили, но я получаю ошибку 404 в консоли, потому что она не может найти /documents/templates . Мне нужно изменить мои маршруты, не так ли?
0

Что именно вы хотите вернуть? В зависимости от ваших потребностей существует несколько разных подходов.

$(data).find('selector') является наименее элегантным. Вы можете извлечь все, что вам нужно, из полного ответа с помощью jQuery.

respond_with(@output, :layout => !request.xhr? ) будет отображать страницу без окружающего файла application.html. Ниже приведен способ отображения другого частичного для jQuery.

respond_with(@output) do |format|
  format.html { render partial: 'templates' if request.xhr? }
end

Вы также можете отправить обратно JSON достаточно легко, если это то, что вам нужно. Здесь есть хороший блог о различных подходах к Rails AJAX: http://madebydna.com/all/code/2011/12/05/ajax-in-rails-3.html

  • 0
    Проблема в том, что полный ответ не является тем, чем он должен быть. Ответ должен возвращать значение content каждого экземпляра template . Но .get() даже не достигает метода Rails ... это реальная проблема здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню