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:
保存Post
调用 process
回调 (after_create_commit)
调用re_process
(因为它在process
方法中被调用
做 save!
)
再次调用process
(因为它在re_process
中被调用)
等等...
此循环导致 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
选项中指定什么,都会执行回调。
希望对您有所帮助
我有这个简单的模型:
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:
保存Post
调用
process
回调 (after_create_commit)调用
re_process
(因为它在process
方法中被调用 做save!
)再次调用
process
(因为它在re_process
中被调用)等等...
此循环导致 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
选项中指定什么,都会执行回调。
希望对您有所帮助