Обработка AJAX-запросов в Ruby on Rails
Обработка AJAX-запросов в Ruby on Rails, рассмотрен обычный механизм, без использования возможностей Rails для обработки ajax-запросов. Те, кто достаточно хорошо знаком с построением таких приложений, пожалуй вряд ли найдет для себя что-то новое.
Для примера сделаем форму, которую будем отправлять через ajax.
1. Прописываем маршруты:
get 'form' => 'forms#index', :as => :form post 'form' => 'forms#form_send', :as => :form_send
2. Контроллер:
class FormsController < ApplicationController # не использовать layout, кроме основной страницы, отображаемой через экшн index layout false, :except => :index # здесь отображаем форму # сюда приходят запросы 'GET' /form def index @name = nil end # здесь принимаем запрос на отправку формы # сюда приходят запросы 'POST' /form def form_send # для пущей безопасности проверим корректность запроса # принимаем только ajax-запросы unless request.xhr? head :bad_request return end # при повторном отображении формы, # значение, введенное пользователем сохранится @name = params[:name] # какие-то действия с данными формы, проверки ... # возможно отобразить ту же форму - используем _form.html.erb, # т.к. на странице изменился только этот блок, например, # в случае ошибки, но с выводом сообщения об ошибке if error render :partial => 'forms/form', locals: { error_message: 'Сообщение об ошибке' } return end # ...либо просто отобразить какой-то текст render :text => 'Форма успешно отправлена' end end
3. Шаблон страницы, содержащей форму (views/forms/index.html.erb):
<%= # div.form_block - для загрузки результата выполнения ajax-запроса content_tag(:div, :class => :class => :form_block) do render 'form' end %>
в том же файле прописываем код jQuery:
4. Блок (партиал) формы (views/forms/_form.html.erb) - блок, который отрисовывается и в index, и можем вернуть как результат запроса, чтобы заново отобразить форму:
<%= # отображение сообщение об ошибке, если есть if (error_message ||= nil) content_tag(:span, error_message, :class => :error_message) end %> <%= form_tag(form_send_path, :id => :form_id) do label_tag(:name, 'имя') + text_field_tag(:name, @name) + submit_tag('отправить') end %>
Единственное, что через такую форма нельзя отправить файлы на сервер, но для этого есть достаточно надежный механизм использования скрытого iframe.
Для простоты и чистоты кода опущены различные проверки. Про особенности использования layout при обработке исключений ajax-запросов я уже писал.
Для использования механизмов ajax Ruby on Rails необходимо использовать :remote => :true (в кнопках, ссылках) для отправки ajax-запрса, а в контроллере:
respond_to
format.js { render json: ... }
...
...и использовать уже блок (партиал) _form.js.erb:
$('#id').html("<%= render 'partial_name' %>");
Но с данным механизмом RoR я пока особо не разбирался, т.к. вышеописанный самописанный мной алгоритм меня устраивает полностью.