【问题标题】:Callbacks raises stack level too deep回调将堆栈级别提高得太深
【发布时间】:2013-09-14 11:31:15
【问题描述】:

我需要为 :assign_state 和 :state_closed 运行回调,但它们不起作用并引发

Stack level to deep

Ticket.rb

class Ticket < ActiveRecord::Base
    before_save :default_values
  after_update :state_closed
  after_create :assign_state

  attr_accessible :description, :title, :employee_department_id, :user_id, :first_name,
   :last_name , :email, :state_id, :employee_id, :ticket_state, :assign_state


  belongs_to :employee_department
  belongs_to :user
  belongs_to :state
  belongs_to :employee

  has_many :replies

  def default_values
    self.state_id = 3 if self.state_id.nil?
  end

  def to_label
    ticket_state.to_s
  end

  def state_closed
    if self.ticket_state == "Solved" || self.ticket_state == "Canceled" 
      self.ticket_state = "Closed"
      self.save
    end
  end

def assign_state
  if self.employee_id.nil?
    self.assign_state = "Un-assigned"
  else 
    self.assign_state = "Assigned"
  end 
  self.save
end

   Ticket.all.each do |ticket|
    if ticket.ticket_state.blank?
      ticket.ticket_state = 'open'
    end
    ticket.save
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.2 callback


    【解决方案1】:

    您的 assign_state 以无限递归方式调用自身:它调用 #save,进而触发 #assign_state 回调。

    【讨论】:

    • 我的回调不起作用,也没有引发错误,你能帮帮我吗?
    • 特别是什么回调?他们都是?你如何触发它们?您说 assign_state 引发了“堆栈级别”错误,为什么不再调用它?
    • 这是一个大写字母的问题,但现在解决了。谢谢:D
    【解决方案2】:

    如果您不调用save,则可以使用before_updatecallback 或在回调中使用update_attributes

    before_update :state_closed
    
    def state_closed
      if self.ticket_state == "Solved" || self.ticket_state == "Canceled" 
        self.ticket_state = "Closed"
      end
    end
    

    这将更新ticket_state,原始更新调用将更新它。所以这种方式更新只被调用一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 2013-10-05
      • 2011-11-17
      • 2012-07-24
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多