在我的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
&amp;我甚至没有测试并得到相同的错误
我已经做了其他after_update
&amp; before_update
在我的其他型号中after_create
模型中的Post
没有任何问题。
我不明白为什么会收到此错误。任何帮助表示赞赏。
我正在使用Rails 4.2.4&amp;红宝石2.2.1p85&amp;我尝试使用after_update
同样的错误
答案 0 :(得分:2)
这是因为您再次在私有方法中调用update方法。这意味着应用程序将进入无限循环并进入死区。
您只需将属性设置为self,无需在私有方法中调用update方法。
class Post < ActiveRecord::Base
before_update :navid_tadding_atgs
private
def navid_tadding_atgs
self.added_by_me = 'yes'
end