【问题标题】:Rails 4: after_update callback leads to endless loopRails 4:after_update 回调导致无限循环
【发布时间】:2014-04-18 02:01:50
【问题描述】:

我在我的用户模型中使用 after_update 回调。

模型用户.rb

after_update :check_phone

check_phone
  phone_validation if phone_changed?
end

def phone_validation
  code = Array.new(8){rand(36).to_s(36)}.join
  self.phone_verification_code = code
  self.save
end

但是,这会导致无限循环。问题是在phone_validation方法中self.save之后再次调用回调。 phone_changed? 显然仍然返回 true。我该如何改变这种行为?

【问题讨论】:

    标签: ruby-on-rails callback


    【解决方案1】:

    试试这个:

    用户.rb

    attr_accessor  :phone_checked
    
    after_update :check_phone, :unless => "phone_checked"
    
    check_phone
      phone_validation if phone_changed?
    end
    
    def phone_validation
      code = Array.new(8){rand(36).to_s(36)}.join
      self.phone_verification_code = code
      self.phone_checked = true  # update flag
      self.save
    end
    

    谨慎使用:skip callbacks

    def phone_validation
     code = Array.new(8){rand(36).to_s(36)}.join
     self.update_column(:phone_verification_code => code)
    end
    

    【讨论】:

      【解决方案2】:

      在您的情况下,self.save 触发 update 触发 after_update 再次以无限循环结束。

      尝试使用before_update 而不是after_update

      before_update :check_phone
      
      check_phone
        phone_validation if phone_changed?
      end
      
      def phone_validation
        code = Array.new(8){rand(36).to_s(36)}.join
        self.phone_verification_code = code
        self.save
      end
      

      【讨论】:

      • 这在我的情况下不起作用,因为回调触发了一些在更新之前不能执行的其他代码。
      • 对我来说完全有效!并防止两次击中分贝,从而双赢。谢谢!
      【解决方案3】:

      试试:

      def phone_validation
        code = Array.new(8){rand(36).to_s(36)}.join
        self.update_column(phone_verification_code,code)
      end
      

      希望对你有帮助:)

      【讨论】:

      • 不,因为您的语法错误。它应该是 update_columns(name => value)update_column(name, value)
      • 我已经更新了。无论如何,逻辑会起作用,对吧?
      • 是的,update_column 确实跳过了回调。不幸的是,它也跳过了验证,这在我的情况下是一个交易破坏者。
      • 是的,在这种情况下,您可以使用已接受答案中的逻辑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 2021-06-12
      • 2011-08-23
      • 1970-01-01
      • 2020-08-27
      • 2021-05-07
      相关资源
      最近更新 更多