Ruby on Rails - 执行 after_update 时出现 SystemStackError(堆栈级别太深)

Ruby on Rails - SystemStackError (stack level too deep) when doing after_update

在我的 Post 模型中,当更新 post 时,我想执行 before_update 来更新我的一个属性。

class Post < ActiveRecord::Base

  before_update :navid_tadding_atgs
  private
    def navid_tadding_atgs
      self.update_attributes(added_by_me: 'yes')
    end

这导致了这个错误:

Completed 500 Internal Server Error in 3539ms (ActiveRecord: 25.6ms)

SystemStackError (stack level too deep):
  app/models/post.rb:167:in `navid_tadding_atgs'
  app/models/post.rb:167:in `navid_tadding_atgs'
  //.....
  app/controllers/posts_controller.rb:70:in `block in update'
  app/controllers/posts_controller.rb:69:in `update'

这是我的PostController#Update操作:

class PostsController < ApplicationController
  def update
    authorize @post
    respond_to do |format|
      if @post.update(post_params)
        format.html { redirect_to @post, notice: 'Post was successfully updated.' }
        format.json { respond_with_bip(@post) }
      else
        format.html { render :edit }
        format.json { respond_with_bip(@post) }
      end
    end
  end

    def post_params
      params.require(:post).permit(:post_type, :category, :post_identity, :tags, :added_by_me)
    end

PS:format.json { respond_with_bip(@post) } 用于 best_in_place gem & 我什至在没有测试的情况下得到了同样的错误

我已经在我的其他模型中做了其他 after_updatebefore_update 并且在相同的 Post 模型中做了 after_create 没有任何问题。

我不明白为什么会出现此错误。感谢您的帮助。

我正在使用 Rails 4.2.4 和 ruby 2.2.1p85 并且我已经尝试使用 after_update 但同样的错误

因为你又在你的私有方法中调用了update方法。这意味着应用程序将进入无限循环并进入死机状态。

只需要将属性设置到self中即可,无需在私有方法中调用update方法

class Post < ActiveRecord::Base

  before_update :navid_tadding_atgs

  private

  def navid_tadding_atgs
    self.added_by_me = 'yes'
  end