field_with_errors 未应用于改革表单对象
field_with_errors not being applied on reform form object
我正在使用 reform gem 创建表单对象。通常在 rails 中:当表单验证失败时:field_with_errors
class 包装无效字段的标签和输入。这不会发生在我的改革表单对象中。
这是表单对象的 class:
# 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
包装,因此没有使用 rails 默认 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 来对我的 rails 项目进行改革:
gem 'reform-rails', '0.2.0rc1'
那个版本不稳定。我切换到最新的稳定版本,一切都按预期工作。无需手动添加field_with_errors
:
gem 'reform-rails', '~> 0.1.7'
最简单的解决方案是使用 simple_form_for gem 这将创建整个组件(标签、输入和内联错误消息):
<%= simple_form_for signup_form do |form| %>
<%= form.input :name %>
否则你需要自己添加内联错误信息,例如:
<%= form.object.errors[:name].join(', ') %>
我正在使用 reform gem 创建表单对象。通常在 rails 中:当表单验证失败时:field_with_errors
class 包装无效字段的标签和输入。这不会发生在我的改革表单对象中。
这是表单对象的 class:
# 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
包装,因此没有使用 rails 默认 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 来对我的 rails 项目进行改革:
gem 'reform-rails', '0.2.0rc1'
那个版本不稳定。我切换到最新的稳定版本,一切都按预期工作。无需手动添加field_with_errors
:
gem 'reform-rails', '~> 0.1.7'
最简单的解决方案是使用 simple_form_for gem 这将创建整个组件(标签、输入和内联错误消息):
<%= simple_form_for signup_form do |form| %>
<%= form.input :name %>
否则你需要自己添加内联错误信息,例如:
<%= form.object.errors[:name].join(', ') %>