field_with_errors не применяется к объекту формы реформы

Я использую камень реформы, чтобы создать объект формы. Обычно в рельсах: когда проверка не проходит в форме: field_with_errors Класс оборачивает метку и ввод недопустимых полей. Это не происходит в моем объекте формы реформы.

Вот класс для объекта формы:

# app/forms/signup_form.rb
class SignupForm < Reform::Form
  include Reform::Form::ActiveRecord
  include Composition

  model :user, on: :user 

  property :id,               on: :user
  property :name,             on: :user

  property :blog_id,          on: :blog, from: :id
  property :user_id,          on: :blog
  property :title,            on: :blog

  validates :name, presence: true
  validates :title, presence: true

end

А вот актуальная форма:

# app/views/users/_form.html.erb
<%= form_for(signup_form, url: signup_form_path(signup_form.model[:user]), method: signup_form_method(signup_form.model[:user])) do |form| %>

  <% if signup_form.errors.size > 0 %>
    <div>
      <p><%= pluralize(signup_form.errors.size, "error") %> prohibited the data from persisting</p>
      <p>There were problems with the following fields:</p>
      <ul>
        <% signup_form.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <%= form.hidden_field(:user_id, value: form.object.user_id) %>

  <div class="field">
    <%= form.label :name, "* Name" %>
    <%= form.text_field :name %>
  </div>

  <div class="field">
    <%= form.label :title, "* Title" %>
    <%= form.text_field :title %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

Вот как выглядит форма перед отправкой:

предыдущие представления

Если я нажму Create User кнопка, не заполняя ничего, она терпит неудачу, потому что Name а также Title поля обязательны для заполнения. Он не работает должным образом, но недопустимые метки и поля не переносятся field_with_errors и, следовательно, не стилизованы с рельсов по умолчанию field_with_errors моделирование. Это выглядит так:

после подачи


Применяя утвержденный ответ для полного решения кода этого вопроса:

<div class="field <%= form_obj_field_with_errors(form.object.errors[:name].join(',')) %>">
  <%= form.label :name, "* Name" %>
  <%= form.text_field :name %>
</div>

<div class="field <%= form_obj_field_with_errors(form.object.errors[:title].join(',')) %>">
  <%= form.label :title, "* Title" %>
  <%= form.text_field :title %>
</div>

А вот и помощник:

def form_obj_field_with_errors(error_msg)
  return unless error_msg.present?
  return 'field_with_errors'
end

Обновить!!!

Оказывается, вышеприведенное решение не является необходимым. Реформа действительно применяется field_with_errors, Моя ошибка заключалась в том, что я использовал последнюю, нестабильную версию реформы в своем проекте rails.

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

gem 'reform-rails', '0.2.0rc1'

Эта версия была нестабильной. Я перешел на последнюю стабильную версию, и все заработало как положено. Не нужно добавлять field_with_errors рукой:

gem 'reform-rails', '~> 0.1.7'

1 ответ

Решение

Самое простое решение - использовать gem simple_form_for, который создаст весь компонент (метка, ввод и встроенное сообщение об ошибке):

<%= simple_form_for signup_form do |form| %>
  <%= form.input :name %>

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

<%= form.object.errors[:name].join(', ') %> 
Другие вопросы по тегам