Rails:显示控制器添加的错误消息

时间:2013-09-24 13:49:03

标签: ruby-on-rails-3

我正在像这样的控制器动作中创建新产品

product = Product.new
    product.name = params['name']
    if params['quantity']=="" then product.errors.add(:base, "Quantity must be filled") end


    if !product.save
     @product = product
     render "index"
    end

即时查看错误

<% @product.errors.each do |attr, msg| %>
          <li> <%= msg %></li>
<% end %>

显示所有错误但仅显示:不显示基本错误。我该如何展示它们?

数量列不是产品型号的一部分。

(解决方案)工作代码:

product.valid? 
if params['quantity']=="" then product.errors.add(:base, "error") end
if product.errors.any?
      @product = product
      render "index"
      return
else
      product.save

1 个答案:

答案 0 :(得分:1)

这不是gona的工作,因为rails在运行验证之前会从错误中删除所有内容。 Save正在运行验证,因此您的自定义错误已被删除。

我个人认为在控制器内进行任何验证是错误的。但如果您真的想这样做,请尝试:

product = Product.new(name: params[:name])
product.valid?
product.errors.add(:base, "Quantity must be filled") if params['quantity'].blank? then

if product.errors.any? || !product.save(false)
 @product = product
 render "index"
end

然而,这很可能是一个坏主意。如果数量与产品型号有关,则应通过型号进行验证。如果没有,则不应将其添加到models.errors。

你应该尝试做某事:

product = Product.new(name: params[:name])
if params[:quantity].blank? || !product.save
 @product = product
 flash[:error] = "Quantity must be filled" unless params[:quantity]
 render "index"
end

然后在视图中添加一些代码来处理flash[:error]