为什么我的新函数在遇到验证错误时没有重新创建对象?

时间:2013-04-02 19:34:59

标签: ruby-on-rails-3

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

错误是:

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]

1 个答案:

答案 0 :(得分:0)

如果我正确了解情况,您对render action: "new"的调用不会调用控制器中的new方法,它只会使用您的实例变量呈现new视图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