我有一个表单来创建产品。产品有许多带验证的字段。例如:
假设用户试图保存空表单。现在我想显示有以下类型的错误哈希:
{
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中应该采用什么方法?
谢谢,
答案 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来实现这一点,它将使所有页面的验证变得容易。 如果这是你需要的,请告诉我!!