Rails Form_ с отображением встроенного сообщения об ошибке - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь отобразить сообщение об ошибке, встроенное ниже элементов формы в моем приложении rails.

Я сделал следующее.

Контроллер

def create
    @faculty = Faculty.new(faculty_params)
    respond_to do |format|
        if @faculty.save
            format.html { redirect_to admin_faculties_path, notice: 'Faculty was successfully created.'}
            format.json {render json: @faculty, status: :created, location: @faculty}
        else
            format.html {render '_form'}
            format.json {render json: @faculty.errors, status: :unprocessable_entity }
        end
    end
end

Форма

    <% form_with(model: [:admin, @faculty]) do |f| %>
<div class="card-title">Add Faculty</div>
    <div class="form-group">
        <%= f.label :faculty_name, class: "form-label" do %>
        Faculty Name <span class="form-required">*</span>
        <% end %>
        <%= f.text_field :faculty_name, class: "form-control", placeholder: "Faculty Name", required: true %>
    </div>
<%= f.submit class: "btn btn-primary" %>

Поскольку у меня есть некоторые правила проверки в Model, он проверяет проверкии прекратить отправку формы, если проверки происходят.Так как это form_with формы, все запросы обрабатываются Ajax.Итак, я хочу показать ошибки валидации под каждым элементом формы.Пожалуйста, предложите мне примеры, чтобы я мог выполнить эту задачу.

1 Ответ

0 голосов
/ 01 февраля 2019

Вы можете проверить наличие у каждого атрибута ошибок в полях формы, и если в этом атрибуте есть ошибки, просто покажите их

<% form_with(model: [:admin, @faculty]) do |f| %>
  <div class="card-title">Add Faculty</div>
  <div class="form-group">
    <%= f.label :faculty_name, class: "form-label" do %>
      Faculty Name <span class="form-required">*</span>
    <% end %>
    <%= f.text_field :faculty_name, class: "form-control", placeholder: "Faculty Name", required: true %>
    <% if @faculty.errors[:name].any? %>
      <ul>
        <% @faculty.errors[:name].each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    <% end %>
  </div>
<%= f.submit class: "btn btn-primary" %>

Лучшим решением может быть рефакторинг, который на helper :

Helper

module FacultyHelper

  def inline_errors(model, model_attribute)
    result = ""
    if model.errors[model_attribute].any?
         model.errors[model_attribute].each do |message|
            result += "<li>#{message}</li>"
        end
    end
    return "<ul>#{result}</ul>".html_safe
  end
end

Просмотр [ОБНОВЛЕНИЕ: оболочка для ошибок имени]

<% form_with(model: [:admin, @faculty]) do |f| %>
  <div class="card-title">Add Faculty</div>
  <div class="form-group">
    <%= f.label :faculty_name, class: "form-label" do %>
      Faculty Name <span class="form-required">*</span>
    <% end %>
    <%= f.text_field :faculty_name, class: "form-control", placeholder: "Faculty Name", required: true %>
    <div id="user_name_errors">
       <%= inline_errors(@faculty, :name) %>
    </div>
  </div>
<%= f.submit class: "btn btn-primary" %>

Для удаленного: true, вам необходимо определить на вашем контроллере формат .js

Контроллер

def create
    @faculty = Faculty.new(faculty_params)
    respond_to do |format|
        if @faculty.save
            format.html { redirect_to admin_faculties_path, notice: 'Faculty was successfully created.'}
            format.json {render json: @faculty, status: :created, location: @faculty}
            format.js
        else
            format.html {render '_form'}
            format.json {render json: @faculty.errors, status: :unprocessable_entity }
            format.js
        end
    end
end

Создать соответствующий js.erb-просмотр

create.js.erb

$("#user_name_errors").html("<%= inline_errors(@faculty, :name) %>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...