【问题标题】:Ruby on Rails - SystemStackError (stack level too deep) when doing after_updateRuby on Rails - 执行 after_update 时出现 SystemStackError(堆栈级别太深)
【发布时间】:2017-06-30 12:26:30
【问题描述】:

在我的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 时出现同样的错误

【问题讨论】:

    标签: ruby-on-rails ruby model before-filter


    【解决方案1】:

    这是因为您在私有方法中再次调用了更新方法。这意味着应用程序将进入无限循环并陷入死机状态。

    只需将属性设置为self,无需在私有方法内部调用update方法。

    class Post < ActiveRecord::Base
    
      before_update :navid_tadding_atgs
    
      private
    
      def navid_tadding_atgs
        self.added_by_me = 'yes'
      end
    

    【讨论】:

    • 谢谢@Bharat。天哪,男人做这么愚蠢的事情哈哈。谢谢一堆:)
    • 我会做的 :) 不能在 10 分钟之前做,所以说
    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 2013-10-05
    • 2017-08-19
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多