2013-09-24 34 views
1

進出口創造了這樣的Rails:顯示控制器添加錯誤信息

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 

和IM一樣,

<% @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 
+0

好像你只是想'數量'字段驗證... – meagar

回答

1

這不是戈納工作,如軌道只是運行驗證之前刪除一切從錯誤。 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]

+0

謝謝你的作品,我知道它不是最佳做法..但我希望所有的錯誤消息一次顯示..我想過一些一般錯誤類,我會添加模型錯誤,但這是更容易..數量是從其他模型,但我需要確保其填充之前,我保存產品..(這兩種模型都保存或沒有一個)..我編輯問題與工作代碼 – Muflix

+1

如果兩個模型要同時保存並且彼此關聯,則可以在關聯上使用自動保存選項。它將允許您一次保存它們,並且如果出錯,rails會自動回滾這兩個事務。 – BroiSatse

+0

自動保存是有趣的,我不知道..但我會保持現在簡單:-) – Muflix