Rails: Почему я получаю 204 ответа от всех, кроме первого запроса? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть кнопка на моей домашней странице.При нажатии он отправляет POST-запрос на forms_controller, чтобы создать новую форму.

Моя кнопка:

<%= link_to 'Add form', forms_path, id: 'add_form_button',
                                 class: 'btn btn-primary',
                                method: :post, remote: true %>

Когда запрос завершен, на консоль записывается сообщение:

<script>
  $('#add_form_button').on('ajax:complete', function(){
    console.log('Request complete!');
    });
</script>

Это действие:

def create
  current_user.forms.create
end

Мои маршруты определены так:

Rails.application.routes.draw do
  devise_for :users
  root to: 'home#show'
  resources :forms, except: [:index]
  get 'user_forms' => 'partials#user_forms'
end

Работает, как и ожидалось.Каждый раз, когда я нажимаю кнопку, создается новая форма, и сообщение заносится в консоль.

Однако после создания формы я хочу перезагрузить div, чтобы увидеть вновь созданную формуперечислены вместе с другими:

$('#add_form_button').on('ajax:complete', function(){
  console.log('Request complete!')
  var user_forms = '#user_forms';
  $(user_forms).load('user_forms',function(){
    document.getElementById('add_form_button').scrollIntoView();
  });
});

В случае .load('user_forms')..., user_forms - это маршрут к действию, которое я создал для возврата части:

class PartialsController < ApplicationController
  def user_forms
    render partial: 'home/user_forms'
  end
end

при первом нажатии кнопки она работает как положено: создается новая форма, сообщение заносится в консоль, а div перезагружается с частичным, чтобы в нем отображалась вновь созданная форма.

Но этоне работает при последующих кликах.Новые формы создаются при каждом нажатии кнопки, но div не перезагружается и сообщение не записывается на консоль.Я также вижу следующую ошибку в терминале Rails:

No template found for FormsController#create, rendering head :no_content
Completed 204 No Content in 454ms (ActiveRecord: 2.6ms)

Я понимаю, что я не определил явный ответ в forms_controller#create, но я не понимаю, почему он работает в первый раз, а не в последующие.,Что мешает ему работать второй раз?

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Ошибка говорит вам, что FormsContoller#create не имеет шаблона.Поскольку вы не указали явное render в этом действии, Rails пытается найти шаблон в forms/create.html.erb.

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

Попробуйте добавить явный рендер в конце действия FormsContoller#create.Что-то вроде render {}, status: :ok.

Не уверен, что это решит проблему с рендерингом формы, но, по крайней мере, это должно устранить ошибку No template found.

0 голосов
/ 26 октября 2018

Во-первых, предпосылка моего вопроса совершенно неверна.Я получаю 204 после каждого клика, но GET-запрос со статусом 200 следует за первым кликом.Я предполагал, что 200 был для первого ПОСТА.Совет Касперите, что я должен видеть два запроса на каждый клик, помог мне понять очевидное.

Я не объяснил в своем вопросе, что сама кнопка была в частичном user_forms, который использовался для заполнения перезагруженногодив.(Если бы я упомянул об этом, я бы, вероятно, сразу увидел проблему. Кроме того, само название, которое я дал частичному, должно было быть достаточно большой подсказкой, которого там не должно было быть.)

Хотя $('#add_form_button').on('ajax:complete', function(){...} работает в первый раз, исходная кнопка удаляется из DOM и заменяется идентичной.

Однако, поскольку это совершенно другой элемент, прослушиватель событий не подключен кэта новая кнопка.

Я решил проблему, просто поместив кнопку за пределы партиала.

0 голосов
/ 26 октября 2018

хорошо, я быстро привел пример (используя то, что вы предоставили), и он отлично работает для меня.Обратите внимание, что вы должны видеть только 2 запроса на каждый клик.Видите ли вы другие предупреждения, ошибки?

enter image description here

Я сделал простой user_form частичный, чтобы доказать, что форма загружена как ajax.

<table>
  <% Form.all.each do |f| %>
    <tr>
      <td><%= f.id %></td>
      <td><%= f.name %></td>
    </tr>
  <% end %>
</table>

Итак, ваш код в порядке :).Я бы порекомендовал посмотреть на другого преступника, такого как turbolink (он может испортить ваш ajax), пользовательский скрипт js и т. Д.

...