Rails 每个表单域的验证错误
Rails validation error per form field
我有一个创建产品的表格。一个产品有很多验证字段。例如:
- 姓名:
- 描述:
- 颜色:
- 尺寸:
- 可用数量:
假设用户试图保存空表单。现在我想显示以下类型的错误散列:
{
general: 'Something went wrong, Please contact support team.'
product: {
name: 'Name can not be blank',
description: 'Description can not be blank'
}
}
这样我就可以在顶部显示 general
错误(如果有的话),或者我可以在相应字段的正上方显示错误。
在products_controller
、
def create
@product = Product.new(product_params) # Strong params
if @product.save
flash[:success] = "Welcome to the Sample App!"
redirect_to @product
else
render 'new'
end
end
如何显示每个字段对应的错误?我知道 @product.errors
会给我错误。但我也想保留一个 general
错误键。 flash
是一种方法。但据我所知,我们只能在一瞬间发送短信。 Rails 中的正确方法应该是什么?
谢谢,
这是我解决这个问题的方法。我创建了一个简单的辅助方法,我在每个字段的视图中使用它。它的可扩展性也很强,所以不要觉得受限于它的当前状态。它可以很容易地接受额外的arguments/options能够添加自定义CSS类等
# app/helpers/form_errors_helper.rb
module FormErrorsHelper
def error_message_on(object, method)
return unless object.respond_to?(:errors) && object.errors.include?(method)
errors = field_errors(object, method).join(', ')
content_tag(:div, errors, class: 'form-group-error')
end
private
def field_errors(object, method)
object.errors[method]
end
end
# css
.form-group-error {
# your styling here
}
# form
<%= form_for(@product) do |f| %>
<div class="form-group">
<%= f.label(:name) %>
<%= f.text_field(:name) %>
<%= error_message_on(f.object, :name) %>
</div>
<div class="form-group">
<%= f.label(:description) %>
<%= f.text_area(:description) %>
<%= error_message_on(f.object, :description) %>
</div>
<% end %>
有了这个,您可以添加另一个键 general
到消息哈希。
假设您在模型中这样做。
errors.add(:general, 'This is my general error')
那么,在你看来,你只是使用同一个助手。
error_message_on(f.object, :general)
如果您需要为 "general" 错误设置不同的样式,您可以向该助手传递额外的参数,例如额外的 CSS 类.
只需在 html.erb 文件中使用 <%=f.error_span(:name) %>
示例:
<div class="form-group">
<%= f.label(:name) %>
<%= f.text_field(:name) %>
<%=f.error_span(:name) %>
</div>
注意: 你需要 twitter-bootstrap-rails gem 才能正常工作,这将使所有用户的验证变得容易页。
让我知道这是否是您需要的!!
我有一个创建产品的表格。一个产品有很多验证字段。例如:
- 姓名:
- 描述:
- 颜色:
- 尺寸:
- 可用数量:
假设用户试图保存空表单。现在我想显示以下类型的错误散列:
{
general: 'Something went wrong, Please contact support team.'
product: {
name: 'Name can not be blank',
description: 'Description can not be blank'
}
}
这样我就可以在顶部显示 general
错误(如果有的话),或者我可以在相应字段的正上方显示错误。
在products_controller
、
def create
@product = Product.new(product_params) # Strong params
if @product.save
flash[:success] = "Welcome to the Sample App!"
redirect_to @product
else
render 'new'
end
end
如何显示每个字段对应的错误?我知道 @product.errors
会给我错误。但我也想保留一个 general
错误键。 flash
是一种方法。但据我所知,我们只能在一瞬间发送短信。 Rails 中的正确方法应该是什么?
谢谢,
这是我解决这个问题的方法。我创建了一个简单的辅助方法,我在每个字段的视图中使用它。它的可扩展性也很强,所以不要觉得受限于它的当前状态。它可以很容易地接受额外的arguments/options能够添加自定义CSS类等
# app/helpers/form_errors_helper.rb
module FormErrorsHelper
def error_message_on(object, method)
return unless object.respond_to?(:errors) && object.errors.include?(method)
errors = field_errors(object, method).join(', ')
content_tag(:div, errors, class: 'form-group-error')
end
private
def field_errors(object, method)
object.errors[method]
end
end
# css
.form-group-error {
# your styling here
}
# form
<%= form_for(@product) do |f| %>
<div class="form-group">
<%= f.label(:name) %>
<%= f.text_field(:name) %>
<%= error_message_on(f.object, :name) %>
</div>
<div class="form-group">
<%= f.label(:description) %>
<%= f.text_area(:description) %>
<%= error_message_on(f.object, :description) %>
</div>
<% end %>
有了这个,您可以添加另一个键 general
到消息哈希。
假设您在模型中这样做。
errors.add(:general, 'This is my general error')
那么,在你看来,你只是使用同一个助手。
error_message_on(f.object, :general)
如果您需要为 "general" 错误设置不同的样式,您可以向该助手传递额外的参数,例如额外的 CSS 类.
只需在 html.erb 文件中使用 <%=f.error_span(:name) %>
示例:
<div class="form-group">
<%= f.label(:name) %>
<%= f.text_field(:name) %>
<%=f.error_span(:name) %>
</div>
注意: 你需要 twitter-bootstrap-rails gem 才能正常工作,这将使所有用户的验证变得容易页。 让我知道这是否是您需要的!!