Rails:before_save - 堆栈级别太深

jon*_*hue 1 ruby-on-rails before-save stack-level

我有这个简单的模型:

class Post < ApplicationRecord

    after_create_commit :process
    before_save :re_process, on: :update

    has_one :processed, class_name: 'Post::Process'

    def process
        self.processed.destroy if self.processed
        processed = self.build_processed
        processed.save!
    end

    private

    def re_process
        self.process if self.title_changed?
    end

end
Run Code Online (Sandbox Code Playgroud)

Stack level to deep每当我创建一个新的时候我都会收到错误Post.

现在当我删除before_save :re_process, on: :update一切正常.

这条线不应该只在我更新帖子时受到影响吗?

asc*_*man 8

是的,你添加的before_save update工作正常.

问题是,您after_create_commit已经创建了代码保存记录的记录.

def process
  # here the Post was already created
  self.processed.destroy if self.processed
  processed = self.build_processed
  processed.save! # And here, you are updating the Post, so it triggers the re_process
end
Run Code Online (Sandbox Code Playgroud)

所以,基本上,当你创建一个帖子时:

  1. 保存帖子

  2. 调用process回调(after_create_commit)

  3. 调用re_process(因为它process在执行时调用方法save!)

  4. process再次打电话(因为它被称为re_process)

  5. 等等...

这个循环导致了 Stack level to deep

希望它有所帮助!