Рельсы с частичной формой свернуты в Bootstrap аккордеоне - сделайте проверку Ajax - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть страница-указатель гостевого контроллера, которая показывает имена всех гостей в аккордеоне bootstrap. Когда щелкают имя гостя, запускается аккордеон, и он показывает форму редактирования для этого гостя, где можно изменить данные формы.

Форма настраивается через simple_form_for с remote: true, поэтому при отправке запускается запрос AJAX. Я также настроил проверки для модели Guest (например, validates :name, :last_name, presence: true). Когда форма находится на отдельной странице редактирования, все проверки работают должным образом. Когда я встраиваю форму в bootstrap аккордеон страницы индекса через render partial: 'edit', после отправки AJAX проходит правильно, но аккордеон разрушается. Если я пытаюсь отправить форму с пустым полем имени, когда аккордеон разрушается, на нем не отображается ошибка проверки и происходит сбой обновления формы (т. Е. Поля формы сбрасываются на те, которые хранятся в БД).

I хотел бы при отправке формы, чтобы аккордеон оставался открытым и чтобы необходимые показы отображались при необходимости.

Не уверен, поможет ли это, но я использую Rails 6 с гемами Turbolinks и Turbolinks_render для управления AJAX запросов.

Мой соответствующий Gemfile:

gem 'webpacker', '~> 4.0'
gem 'turbolinks', '~> 5'
gem 'simple_form'
gem 'turbolinks_render'

Контролер моих гостей:

class GuestsController < ApplicationController
  before_action :set_guest, only: [:edit, :update]

  def index
    @guests = Guests.all
  end

  def edit
  end

  def update
    if @guest.update(guest_params)
      redirect_to guests_path
    else
      @guests = Guests.all
      render 'index'
    end
  end

  private

  def set_guest
    @guest = Guest.find(params[:id])
  end

  def guest_params
    params.require(:guest).permit(:name, :last_name)
  end
end

Мой индекс. html .erb:

<div id="accordion">
    <% @guests.each do |guest| %>
      <div class="card">
        <div class="card-header" id="heading<%= guest.id %>">
          <h5 class="mb-0">
            <button id="ciao" class="btn btn-link collapsed" data-toggle="collapse" data-target="#collapse<%= guest.id %>" aria-expanded="false" aria-controls="collapse<%= guest.id %>">
              <%= "#{guest.name} #{guest.last_name}"%>
            </button>
          </h5>
        </div>
          <div id="collapse<%= guest.id %>" class="collapse" data-parent="#accordion" aria-labelledby="heading<%= guest.id %>">
            <div class="card-body">
              <%= render 'edit', guest: guest %>
            </div>
        </div>
      </div>
  <% end %>
  </div>

Мой _edit. html .erb:

<%= simple_form_for guest, remote: true do |f| %>
  <%= f.input :name %>
  <%= f.input :last_name %>
  <%= f.submit "Submit", class: "btn btn-primary", id: "form_#{guest.id}" %>
<% end %>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...