执行after_update

时间:2017-06-30 12:26:30

标签: ruby-on-rails ruby model before-filter

在我的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同样的错误

1 个答案:

答案 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