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_update
和 before_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
在我的 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_update
和 before_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