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 に追加しないでください。

おそらく次のように sth を実行してみてください:

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 に答える