Rails 3:过滤后模型导致无限循环

Posted

技术标签:

【中文标题】Rails 3:过滤后模型导致无限循环【英文标题】:Rails 3: Model After Filter causing infinite loop 【发布时间】:2012-10-17 16:07:03 【问题描述】:

我有以下后过滤器:

用户模型:

  def check_for_custom_district
    unless self.custom_district.blank?
      district = District.new(:name => custom_district, :state_id => state_id, :school_type_id => school_type_id)

      if district.save(false)
        school = School.new(:name => custom_school, :state_id => state_id, :country_id => 1, :source => "User")
        if school.save(false)
          district.schools << school
          update_attribute(:school_id, school.id)
        end
      end
    end
  end

  def check_for_custom_school
    if self.custom_district.blank? and self.custom_school.present?
      school = School.new(:name => custom_school, :state_id => state_id, :country_id => 1, :source => "User", :school_district_id => district_id)
      school.save(false)
      update_attribute(:school_id, school.id)
    end
  end

我进行了一些调试以将结果输出到控制台,并且代码遇到了check_for_custom_district 方法并由于某种原因导致了无限循环。不知道如何阻止这种情况...有什么想法吗?

【问题讨论】:

【参考方案1】:

我假设它是一个 after_save 过滤器。

假设您刚刚保存了您的model

它触发after_save 过滤器。但是,在您的过滤器中,您实际上调用了update_attribute(:school_id, school.id),这也会保存当前模型,这会再次触发您的after_save 过滤器。

这就是你的无限循环的来源。

解决此问题的一种方法可能是根本不使用after_save 过滤器。例如,只需重新实现save 方法:

def save(*)
  # your custom logic goes here
  super
end

【讨论】:

以上是关于Rails 3:过滤后模型导致无限循环的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 视图中的 onReceive 导致无限循环

为啥这会导致无限请求循环?

为啥这会导致无限请求循环?

为啥这会导致无限循环

while循环中的Javascript continue语句导致无限循环

Material-UI 数据网格 onSortModelChange 导致无限循环