Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 当遇到验证错误时,为什么我的新函数不重新创建对象?_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 3 当遇到验证错误时,为什么我的新函数不重新创建对象?

Ruby on rails 3 当遇到验证错误时,为什么我的新函数不重新创建对象?,ruby-on-rails-3,Ruby On Rails 3,我正在检查我的应用程序,确保它正确响应验证问题。在这种特殊情况下,创建新的交货订单时,必须使用唯一的编号。我发现当我输入一个重复的数字时,系统会显示一个错误 错误是: undefined method `purchase_request_fundings' for nil:NilClass 我知道为什么会发生这个错误,但我不知道如何修复它。出现此错误的原因是,在应用程序发现验证错误后,它试图将用户踢回delivery order new函数,并向用户显示友好的错误消息。然而,@purchase

我正在检查我的应用程序,确保它正确响应验证问题。在这种特殊情况下,创建新的交货订单时,必须使用唯一的编号。我发现当我输入一个重复的数字时,系统会显示一个错误

错误是:

undefined method `purchase_request_fundings' for nil:NilClass
我知道为什么会发生这个错误,但我不知道如何修复它。出现此错误的原因是,在应用程序发现验证错误后,它试图将用户踢回delivery order new函数,并向用户显示友好的错误消息。然而,@purchase_request对象在返回到新函数时没有使用任何数据实例化。我认为它没有看到正确查找和设置对象所需的参数,因此对象-@purchase\u request-被保留为nil

我的代码:

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]

如果我正确理解了这种情况,那么对
呈现操作的调用:“new”
不会调用控制器中的
new
方法,它只使用create方法设置的实例变量呈现
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             

您可以发布您的
发货订单
型号吗?您的代码看起来像是,应该有一个
DeliveryOrder#归属于:purchase\u request
。因此,您可以致电
@delivery\u order.purchase\u request
谢谢@danwich…这很简单。