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(', ') %>