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 才能正常工作,这将使所有用户的验证变得容易页。 让我知道这是否是您需要的!!