Rails:before_save - 堆栈级别太深

Rails: before_save - Stack level too deep

我有这个简单的模型:

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

我每次创建新 Post 时都会收到 Stack level to deep 错误。

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

这条线不应该只在我更新 post 时生效吗?

是的,您在 update 上添加的 before_save 工作正常。

问题是您有 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

所以,基本上,当你创建一个 Post:

  1. 保存Post

  2. 调用 process 回调 (after_create_commit)

  3. 调用re_process(因为它在process方法中被调用 做 save!)

  4. 再次调用process(因为它在re_process中被调用)

  5. 等等...

此循环导致 Stack level to deep

希望对您有所帮助!

on: :update or on: :create 不适用于 before_save

为此,您必须使用 before_update

class Post < ApplicationRecord

    after_create_commit :process
    before_update :re_process

    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

如果您将 on 选项与 before_save 一起使用,则无论在 on 选项中指定什么,都会执行回调。

希望对您有所帮助