Как работает 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
Если вы хотите ответить на запрос 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.");
});
/documents/templates
. Мне нужно изменить мои маршруты, не так ли?
Что именно вы хотите вернуть? В зависимости от ваших потребностей существует несколько разных подходов.
$(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
content
каждого экземпляра template
. Но .get()
даже не достигает метода Rails ... это реальная проблема здесь.
rake routes
или укажите путь явно в файле route.rb (например,get 'documents/templates', to: 'documents#templates'
).routes.rb
плюс метод @Oli's Oli ниже работает отлично.