2013-04-02 40 views
1

我正在瀏覽我的應用程序並確保它對驗證問題做出正確響應。在這種特殊情況下,創建新的交貨單時,您必須在創建交貨單時使用唯一的編號。我發現當我輸入重複號碼時,系統顯示錯誤。爲什麼我的新函數在遇到驗證錯誤時不重新創建對象?

的錯誤是:

undefined method `purchase_request_fundings' for nil:NilClass 

我明白爲什麼這個錯誤發生,但我不知道如何解決它。發生該錯誤是因爲在應用程序發現驗證錯誤之後,它會嘗試將用戶踢回到遞送順序新函數,並顯示一條友好的錯誤消息給用戶,但是,@purchase_request對象不會在任何數據實例化時回到新的功能。我認爲它沒有看到它需要找到並正確設置對象的參數,因此對象 - @purchase_request - 保留爲零。

我的代碼:

Controller 

def new                               
    @delivery_order = DeliveryOrder.new(:purchase_request_id => params[:purchase_request])          
    @purchase_request = PurchaseRequest.find(@delivery_order.purchase_request_id)             
end 

def create                              
    @delivery_order = DeliveryOrder.new(params[:delivery_order])                 

    respond_to do |format|                          
    if @delivery_order.save                          
     params[:discrete_tasks].each do |key, value|                    
     DeliveryOrderFunding.create(                       
      :delivery_order_id => @delivery_order.id,                    
      :discrete_task_id => key,                        
      :amount => value                          
     )                              
     end                              

     format.html do                           
     flash[:success] = "Delivery Order was succesfully created"                
     redirect_to @delivery_order                        
     end                              
    else                              
     format.html { render action: "new" }                      
    end                               
    end            
end 

查看包括

= hidden_field_tag 'delivery_order[purchase_request_id]', params[:purchase_request] 

也試過

= hidden_field_tag :purchase_request, params[:purchase_request] 
+0

你可以發佈你的'DeliveryOrder'模型嗎?你的代碼看起來像應該有一個'DeliveryOrder#belongs_to:purchase_request'。 所以你可能會打電話給@ @ delivery_order.purchase_request' – Deradon

回答

0

如果我理解正確的情況下,你要render action: "new"調用不會調用該方法new在你的控制器中,它只會呈現new vi使用您的create方法設置的實例變量。所以你需要做類似的事情:

def create 
    @delivery_order = DeliveryOrder.new(params[:delivery_order]) 

    respond_to do |format| 
     if @delivery_order.save 
     ... 
     else 
     format.html do 
      @purchase_request = PurchaseRequest.find(@delivery_order.purchase_request_id) 
      render action: "new" 
     end 
     end 
    end 
end    
+0

謝謝@danwich ...這很容易。 –

相關問題