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]
4

1 回答 1

0

如果我正确理解这种情况,您的调用render action: "new"不会调用控制器中的方法,它只会使用您的 create 方法设置的实例变量来new呈现视图。new因此,您需要执行以下操作:

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             
于 2013-04-02T19:44:39.427 回答