每个表单字段的Rails验证错误

时间:2016-04-05 18:13:08

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-3.2 ruby-on-rails-4.2

我有一个表单来创建产品。产品有许多带验证的字段。例如:

  • 姓名:
  • 说明:
  • 颜色:
  • 尺寸:
  • 可用数量:

假设用户试图保存空表单。现在我想显示有以下类型的错误哈希:

{
  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中应该采用什么方法?

谢谢,

2 个答案:

答案 0 :(得分:1)

以下是我解决此问题的方法。我创建了一个简单的帮助方法,我在每个字段的视图中使用。它也是相当可扩展的,因此不要受到它当前状态的限制。它可以轻松接受其他参数/​​选项,以便能够添加自定义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)

如果您需要针对“常规”错误使用不同的样式,则可以向该帮助程序传递其他参数,例如其他CSS类。

答案 1 :(得分:0)

只需在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来实现这一点,它将使所有页面的验证变得容易。 如果这是你需要的,请告诉我!!