Rails 4 выполняет частичное с ajax, jquery,: remote => true и reply_to

Кажется, что динамическое отображение страницы с AJAX в ответ на представленную форму является обычным явлением. Ни один из других подобных вопросов не фокусируется на том, как это сделать в общем.

Лучшее сообщение в блоге, которое я мог найти по этому вопросу, было здесь: http://www.gotealeaf.com/blog/the-detailed-guide-on-how-ajax-works-with-ruby-on-rails

Вопрос: Как мне закодировать мое приложение rails, чтобы я мог запускать частичное представление для загрузки через AJAX при отправке формы или нажатии ссылки?

Для этого необходимо присутствовать несколько вещей, в том числе: remote => флаг true в элементе запуска, флаг response_to: js в определении classа controllerа, маршрут, частичный просмотр и, наконец, jquery, чтобы фактически отображать динамический частичный должен содержаться в отдельном файле .html.js.

Ниже приведены примеры фиктивного метода «render_partial_form» controllerа «someajax».

1) Добавить: remote => флаг true в элемент запуска
поставьте флажок: remote => true в теге link или form в файле .html.erb (view) для элемента, который вы хотите вызвать вызов AJAX, например

<%= form_tag("/someajax", method: 'post', :remote => true) do %> 

с: remote => true, rails не будут автоматически переключаться на представления, что позволяет запускать JQuery. Это можно использовать с тегами form_tag, link_tag или других типов.

2) Добавьте «reply_to: html,: js» в верхней части controllerа

В верхней части определения classа вашего controllerа вы должны теперь указать, что controller может отвечать на javascript, а также на html:

 class SomeajaxController < ApplicationController respond_to :html, :js ... def render_partial_form @array_from_controller = Array.new ... end end 

В этом примере переменная передается из controllerа в представление: массив выбранных опций списка, называемый @array_from_controller .

3) Проложите http-глагол методу вашего controllerа

Поскольку я хотел, чтобы форма POSTed вызывала вызов AJAX, я направил пост-глагол для моего controllerа в представление render_partial_form.

 post 'someajax' => 'someajax#render_partial_form 

Метод controllerа, определенный def render_partial_form совпадает с именем представления _render_partial_form.html.erb поэтому нет необходимости вызывать действие визуализации с controllerа.

4) Создайте частичный вид
Частичный вид должен иметь то же имя, что и ваш метод controllerа, и начинаться с подчеркивания: _render_partial_form.html.erb

 

Here is the partial form

<%= form_tag("/next_step", method: 'post') do %> <%= label_tag(:data, "Some options: ") %> <%= select_tag(:data, options_for_select(@array_from_controller.transpose[0].collect)) %> <%= submit_tag('Next') %> <% end %>

5) Создайте файл JQuery

Операторы JQuery запускают визуализацию формы. Замените «render_partial_form» на фактическое имя вашего метода controllerа и частичного представления. Эффект slideDown является необязательным «глазной конфеткой». Создайте файл с расширением .js.erb и тем же именем, что и ваш controller:

render_partial_form.js.erb

 $('#render_partial_form').html("<%= escape_javascript (render partial: 'render_partial_form') %>"); $('#render_partial_form').slideDown(350); 

Вы должны использовать JS-представления (которые имеют расширение js.erb), что-то вроде «create.js.erb» для создания действия controllerа. Затем добавьте format.js в format.js respond_to do |format| ... end respond_to do |format| ... end блок. И добавьте параметр remote: true в вашу форму. Обратите внимание: js.erb должен включать Javascript-код, который вам нужно включить, например:

 $("tbody#items").append("<%= j render(partial: 'your_partial_path') %>") 

Для чего это стоит (потому что я с этим справился в обновлении приложения с Rails 2 до 3): вы также можете сделать это, добавив обработчик событий, который добавляет возвращенный HTML, как и предыдущая библиотека прототипов Rails 2.

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

 form_remote_tag url: {...}, update: ... 

Если ответ приходит как HTML и добавляется автоматически, и замените его следующим:

 form_tag {...}, remote: true 

Добавив обработчик событий в ваш файл application.js который просто делает то же самое, добавляя содержимое к определенному элементу, например:

 $("#myform").on('ajax:success', function(e, data, status, xhr) { $("#container").append(data); )}; 

Тогда … вы можете столкнуться с той же проблемой, что и я, а это значит, что она никогда не срабатывает в случае ajax:success ! Проблема в том, что он ожидает JS или текст в ответе, но он получает HTML. Способ исправить это, чтобы сказать, что ответ будет HTML с использованием атрибута в теге формы:

 form_tag {...}, remote: true, data: {type: :html} 

Кусок пирога!

  • Как хранить данные на S3 и безопасный доступ пользователей к клиенту API / iOS с rails?
  • Ruby on Rails - импорт данных из файла CSV
  • Как переименовать controller и модель рельсов в проект
  • Добавить виртуальный атрибут для вывода json
  • Сервер WAMP не будет работать
  • gem install libv8 --version '3.11.8.17' на rubyе (windows)
  • Nokogiri «Не удалось создать родное расширение gem», когда я запускаю установку пакета
  • Ruby on Rails will_paginate массив
  • Отсутствует хост для ссылки! Укажите параметр хоста или установите default_url_options
  • Redis + ActionController :: Живые streamи не умирают
  • Не удается подключиться к локальному PostgreSQL
  • Давайте будем гением компьютера.