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_updatefrom モデルを削除し、コントローラーの関数自体から呼び出すことで問題を解決しました。

   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列を更新したり、DB表現にタイムスタンプを設定したりする場合は、#update_columnや#touchなどのdbに直接変換する方法を使用します。しかし、reprocess_avatarメソッドが実際に何であるかを確認しないと、より良いアドバイスを提供するのが難しくなります。

于 2012-12-07T12:57:29.843 に答える