1

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

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 %>

所有错误都显示,但只有 :base 错误不显示。我怎样才能显示它们?

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

(解决方案)工作代码:

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

1 回答 1

1

那是行不通的,因为 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]在您的视图中处理。

于 2013-09-24T13:53:33.143 回答