【问题标题】:ActiveModel::MissingAttributeError occurs after deploying and then goes away after a whileActiveModel::MissingAttributeError 在部署后发生,然后在一段时间后消失
【发布时间】:2011-07-25 17:44:32
【问题描述】:

我有一个 Rails 3.0.9 应用程序,一旦部署,就会出现一堆 ActiveModel::MissingAttributeErrors,导致 500 秒。这些错误是随机发生的,有时会加载页面,有时不会,但属性都是数据库中现有的属性,应该可以找到。

奇怪的是,过了一会儿,错误就消失了。突然间,它们不再引起问题。

我一直在寻找解决这个问题的方法,但是这个错误主要发生在有人已经完成 Model.all(:select => 'column_x,column_y') 并正在调用 column_z 或者他们正在使用 cache_money 时。这些事情我都没有做。

谁能帮忙?

【问题讨论】:

    标签: ruby-on-rails ruby activemodel


    【解决方案1】:

    您可能有一个查询没有返回所有列(即使用:select),然后是cache_money;或其他一些 ActiveRecord 插件使用 after_initialize 回调,每当创建新的 ActiveRecord 对象时(即从数据库中获取时)都会执行该回调。

    在该初始化回调中,某些东西试图访问或使用未包含在:select 中的属性。您希望这会为该属性返回 nil,但会引发 ActiveRecord::MissingAttributeError。

    您可以像文章建议的那样挽救 ActiveRecord::MissingAttributeError,或在插件尝试访问或修改属性之前修补插件以使用 has_attribute?(:attribute_name)

    【讨论】:

    • 谢谢,但似乎并非如此。我没有任何不返回所有列的缓存或查询。
    • 哦,对不起,我错过了阅读您的原始问题。请更准确地描述您遇到的错误,即。提供日志文件输出。它应该提示哪个模型中的哪个属性/列给出了 ActiveModel::MissingAttributeError。
    • +1 这可能没有解决 OP 的问题,但这正是我面临的问题。
    • 使用 has_attribute? 在 Rails 4 中为我工作,但我仍然不确定为什么。我在测试中遇到了同样的问题,使用try 时出现了这个错误。在调用该属性 getter 之前调用 has_attribute? 会使问题消失。
    • 不要忘记范围和默认范围。
    【解决方案2】:

    如果您只是在更新数据库后没有任何部署或服务器重新启动后直接遇到此问题,那么对我有用的方法可能对您有用:

    运行heroku restart,它应该被修复。在测功机重新启动之前,旧数据有时仍缓存在服务器上,因此再次启动它会清除所有数据并防止它导致此类错误。希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      我发现了一个有趣的结果,它导致了同样的错误。为了重用代码,我们将演示者类子类化为演示者类,演示者类执行分组以在图形视图中使用。

      为了简化,它是这样的:

      class PostPresenter 
        def query
          Post.where(...stuff....).includes(:wombat)
        end
      end
      

      聚合器做了如下的事情来建立一个每天的帖子表:

      class AggregatePostPresenter < PostPresenter
        def group_query
          query.select('count(*) as cnt, date(created_at)').group('date(created_at)')
        end
      end
      

      对“group_query”的调用会导致 ActiveModel::MissingAttributeError,因为我认为“包含”Wombat 的尝试失败了,因为“wombat_id”不在“select”中包含的属性中。

      但是,这可能不是您的答案,因为无论是否启用缓存都会发生这种情况。

      【讨论】:

        【解决方案4】:

        我遇到了这个问题。确保您的 select: 包含视图中引用的所有字段,包括任何关系 ID 和在您的方法中调用的任何属性。

        只要您的观点和关系很复杂,就很难识别缺失的属性。最简单的调试方法是删除where 子句的select 部分并查看查询/范围/方法是否运行正确。如果是这样,则将所有属性添加到 select 并一次删除一个不需要的属性,直到找到有问题的属性。

        【讨论】:

          【解决方案5】:

          我通过在控制器渲染的末尾添加 .to_json 来解决此问题。

          【讨论】:

          • 我很感兴趣。这是如何解决问题的?
          【解决方案6】:

          当我试图通过 Ajax(实际上是 angularjs)调用来填充就地编辑选择字段时,类似的问题让我很恼火。

          我只想要一个 id 和 name 属性 to_json 并不断收到 MissingAttributeError。

          意识到我在模型中有一个 as_json 方法,该方法用于主索引并显示模型上的调用。基本上是 as_json 没有看到它预期的属性。

          @foo=Foo.select("id,name")
          
          respond_to do |format|
              format.json  { render :json => @foo.to_json }      
          end
          

          给出了错误但是

          respond_to do |format|
              format.json  { render :json => { :foo=>@foo.as_json(:only=>[:id,:name]) } }     
          end
          

          似乎工作正常。我自己也差点怀疑,但我找到了一个很好的解释。

          http://jonathanjulian.com/2010/04/rails-to_json-or-as_json/

          【讨论】:

            【解决方案7】:

            你需要添加一行

            rescue ActiveRecord::MissingAttributeError 
            

            在模型的 after_initialize() 方法中

            【讨论】:

            • 最好在after_initialize运行的方法中使用has_attribute?(:attr_name),而不是一开始就实际命中错误
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-11
            • 1970-01-01
            • 1970-01-01
            • 2011-09-08
            • 2012-04-10
            相关资源
            最近更新 更多