Rails показывает ошибку на старой форме вместо модальной - PullRequest
2 голосов
/ 18 января 2020

Я работаю над приложением, в котором, если пользователь нажимает кнопку «Добавить новый», форма будет отображаться в модальной форме и сможет заполнять, отображать ошибки и вставлять / сохранять данные в базе данных так же, как форма регулярных рельсов.

Вот моя форма @ views/contacts/_form.html:

  <%= form_for(@contact, html: {multipart: true}) do |f| %>

      <div class="card">
        <div class="card-header">
          <h2 class="display-5 main-text-blue text-center font-weight-bold"><%= @contact.new_record? ? 'Add New Contact' : 'Update Contact'%> </h2>
        </div>
        <div class="card-body">

     <div class="errors">
                <% if @contact.errors.any? %>
                    <div class="alert alert-danger">
                       <h5 class="text-center mb-n1 pb-1"><i class="fa fa-exclamation-triangle text-danger"></i> Please correct the following errors: </h5>
                   </div>
                <% end %>
            </div>

          <div class="form-group row">
            <div class="col-md-5 mx-auto">

            <div class="wrap" id="avatar-container">
                  <div class="valign-middle">
                      <div class="form-group">
                          <%= image_tag @contact.contact_avatar.attached? ? @contact.contact_avatar : "100x100.png", class: "img-responsve img-preview" %>
                          <label for="file" class="sr-only">Choose Image</label>
                           <%= f.file_field :contact_avatar, id: "file" %>
                      </div>
                  </div>
              </div>

            </div>
          </div>


          <div class="form-group row">
            <%= f.label :name, class: "col-lg-2 col-form-label" %> 
            <div class="col-lg-10">
              <%= f.text_field :name, class: "form-control #{'is-invalid' if has_error?(@contact, :name) }", id: "name", placeholder: "Name.." %>
                <% if has_error?(@contact, :name) %>
                      <span class="text-danger">
                          <%= get_error(@contact, :name)%>
                      </span>
                <% end %>
            </div>
          </div>


          <div class="form-group row">
             <%= f.label :email, class: "col-lg-2 col-form-label" %> 
            <div class="col-lg-10">
              <%= f.text_field :email, class: "form-control #{'is-invalid' if has_error?(@contact, :email) }", id: "email", placeholder: "Email.." %>
             <% if has_error?(@contact, :email) %>
                      <span class="text-danger">
                          <%= get_error(@contact, :email)%>
                      </span>
                <% end %>
            </div>
          </div>

          <div class="form-group row">
            <%= f.label :mobile, class: "col-lg-2 col-form-label" %> 
            <div class="col-lg-10">
              <%= f.text_field :mobile, class: "form-control #{'is-invalid' if has_error?(@contact, :mobile) }", id: "mobile", placeholder: "Mobile.." %>
              <% if has_error?(@contact, :mobile) %>
                      <span class="text-danger">
                          <%= get_error(@contact, :mobile)%>
                      </span>
                <% end %>
            </div>
          </div>


          <div class="form-group row">
             <%= f.label :phone, class: "col-lg-2 col-form-label" %> 
            <div class="col-lg-10">
             <%= f.text_field :phone, class: "form-control #{'is-invalid' if has_error?(@contact, :phone) }", id: "phone", placeholder: "Phone.." %>
              <% if has_error?(@contact, :phone) %>
                      <span class="text-danger">
                          <%= get_error(@contact, :phone)%>
                      </span>
                <% end %>
            </div>
          </div>


          <div class="form-group row">
            <%= f.label :country, class: "col-lg-2 col-form-label" %>
            <div class="col-lg-10">
               <%= f.text_field :country, class: "form-control", id: "country", placeholder: "Country.." %>
            </div>
          </div>


          <div class="form-group row">
            <%= f.label :address, class: "col-lg-2 col-form-label" %>
            <div class="col-lg-10">
              <%= f.text_field :address, class: "form-control", id: "address", placeholder: "Address.." %>
            </div>
          </div>
          <div class="form-row">
             <%= f.label :location, class: "col-lg-2 col-form-label" %>
            <div class="col-4">
             <%= f.text_field :city, class: "form-control", id: "city", placeholder: "City.." %>
            </div>
            <div class="col-4">
              <%= f.text_field :state, class: "form-control", id: "state", placeholder: "State.." %>
            </div>
            <div class="col-2">
               <%= f.text_field :zip, class: "form-control", id: "zip", placeholder: "Zip.." %>
            </div>
          </div>
          <div class="form-group row category-mt">
             <%= f.label :category, class: "col-lg-2 col-form-label" %>
            <div class="col-lg-5">
                <%= f.collection_select :category_id, Category.all, :id, :name, { prompt: "Select Category" }, id: "category_select", class: "form-control #{'is-invalid' if has_error?(@contact, :category) }" %>
                 <% if has_error?(@contact, :category) %>
                      <span class="text-danger">
                          <%= get_error(@contact, :category)%>
                      </span>
                <% end %>
            </div>
            <div class="col-lg-3">
              <a class="btn btn-outline-secondary add-category-button btn-block mt-1" href="#" id="add-category-btn">Add Category</a>
            </div>
          </div>

          <div class="form-group row" id="add-new-category">
            <label class="col-lg-2 col-form-label" for="location">New Category:</label>
            <div class="col-lg-10">
              <div class="input-group">
                    <input id="new-category" name="new-category" class="form-control"  placeholder="Enter category name" type="text">
                <div class="input-group-append">
                    <button class="btn btn-outline-secondary category-btn" id="save-new-category-btn" type="button"><i class="fa fa-check"></i></button>
                </div>
              </div>
            </div>
          </div>

          <div class="form-group row">
              <%= f.label :note, class: "col-lg-2 col-form-label" %>
            <div class="col-lg-10">
               <%= f.text_area :note, class: "form-control", id: "note", placeholder: "Note..", rows: "3" %>
            </div>
          </div>
        </div>
        <div class="card-footer  text-center mx-auto">
           <%= f.submit @contact.new_record? ? "Save" : "Update", class: "btn btn-primary border-button mb-3 ml-3", id: "save-btn" %>
           <%= link_to "Cancel", contacts_path, class: "btn btn-outline-secondary border-button mt-n3", id: "cancel-btn" %>
      </div>
      </div>

       <% end %>

Затем у меня есть кнопка «Добавить новый», которую я установил на remote: true, чтобы показать новая форма в модальной форме:

      <%= link_to new_contact_path, class: "btn btn-primary border-button float-right", ":data-target" => "#form-modal", ":data-toggle" => "modal", remote: true do %>
           <span><i class="fa fa-plus white"></i> Add New</span>
       <% end %>

А вот мой модальный код:

<!-- Modal -->
<div class="modal fade" id="form-modal" tabindex="-1" role="dialog" aria-labelledby="form-modal" aria-hidden="true">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-body" id="form-modal-body">
          <%= render "form" %>
      </div> 
    </div>
  </div>
</div>

Я также создал new.js.erb файл внутри views/contacts с кодами ff:

$('#form-modal').modal('show');

Я даже пытался отрисовать форму, используя:

$('#form-modal-body').html('<%= escape_javascript render("form") %>')

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

Теперь модал работает отлично и показал новую контактную форму. Однако, когда я попытался нажать кнопку save без ввода каких-либо данных, я ожидаю увидеть сообщения об ошибках / проверку в моей модальной форме, вместо этого она показывает ошибку внутри http://localhost:3000/dashboard/contacts/new, которая является обычной формой рельсов, а не показывает их. внутри модальности.

enter image description here

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

Пожалуйста, помогите!

1 Ответ

1 голос
/ 18 января 2020

Вы должны установить для удаленного атрибута значение true, т. Е. remote: true в #form_for

При нажатии кнопки отправки он отправит запрос формы в Ajax.

<%= form_for(@contact, remote: true, html: {multipart: true}) do |f| %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...