55

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

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

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

任何人都可以帮忙吗?

4

7 回答 7

145

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

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

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

于 2011-07-27T15:59:15.927 回答
7

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

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

于 2015-01-24T17:01:43.353 回答
2

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

为了简化,它类似于:

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”中包含的属性中。

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

于 2011-11-03T16:39:57.130 回答
2

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

于 2014-12-26T16:39:46.913 回答
2

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

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

于 2014-06-30T12:27:53.343 回答
0

当我试图进行 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/

于 2014-01-29T18:39:05.700 回答
-8

你需要添加行

rescue ActiveRecord::MissingAttributeError 

在模型的 after_initialize() 方法中

于 2013-01-30T09:55:02.773 回答