2

在我更新控制器中用户的属性后,我的模型cropping方法在循环中被调用,该循环永远不会结束。

User controller code-

   def change_img  
      @user = current_user

      #this triggers the model's after_update callback
      @user.update_attributes(params[:user])  

      flash[:notice] = "Successfully updated Image."  
      render :action => 'crop'  
   end  

User Model code-

after_update :reprocess_avatar, :if => :cropping? 


  def cropping?  
   #this method is called infinitely why?

  !crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank? 

  end  

一旦设置了crop_x、crop_y、crop_w 和crop_h,该cropping方法将始终返回true,这将继续调用该reprocess_avatar方法。这可能是由于reprocess_avatar方法也在更新avatar用户表的属性。所以再次after_update触发导致循环。

有没有办法在更新后只调用一次该方法?

4

2 回答 2

7

我通过删除after_update模型并从控制器的函数本身进行调用来解决了这个问题。

   def change_img  
      @user = current_user         
      @user.update_attributes(params[:user]) 

      if(!@user.crop_x.blank? && !@user.crop_y.blank? && 
     !@user.crop_w.blank? &&  !@user.crop_h.blank?)
         @user.avatar.reprocess! 
      end

      flash[:notice] = "Successfully updated Image."  
      render :action => 'crop'  
   end  

谢谢!

于 2012-12-07T13:45:20.057 回答
0

如果 reprocess_avatar 正在更新某些内容,请确保您正在使用任何非回调更新方法,这样您就不会在对象中触发任何进一步的回调。例如,如果您要设置标志或更新某些 id 列或在数据库表示上设置时间戳,请使用一些直接到数据库的方法,如 #update_column 或 #touch。但是,如果没有看到您的 reprocess_avatar 方法实际上是什么,就很难给出更好的建议。

于 2012-12-07T12:57:29.843 回答