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 に答える
2

I encountered this issue. Make sure your select: includes all fields referenced in your view, including any relationship IDs and any attributes called within your methods.

The missing attribute can be difficult to identify whenever your views and relationships are complex. The easiest way to debug this is to remove the select portion of your where clause and see if the query/scope/method runs correctly. If so, then add all of the attributes to the select and remove unneeded attributes one-at-a-time until you find the offending attribute.

于 2014-06-30T12:27:53.343 に答える
2

これについて興味深い見解が見つかりましたが、同じエラーが発生しました。コードを再利用する試みとして、グラフ ビューで使用するグループ化を実行するプレゼンター クラスでプレゼンター クラスをサブクラス化します。

簡単に言うと、次のようなものでした。

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

アグリゲーターは、次のようなことを行って、1 日あたりの投稿のテーブルを作成しました。

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

"group_query" を呼び出すと、ActiveModel::MissingAttributeError が発生します。"select" に含まれる属性に "wombat_id" が含まれていないため、Wombat を "include" しようとすると失敗するからです。

ただし、キャッシュが有効かどうかに関係なく発生するため、これはおそらくあなたの答えではありません。

于 2011-11-03T16:39:57.130 に答える
2

.to_jsonコントローラーのレンダリングの最後に追加することでこれを修正しました。

于 2014-12-26T16:39:46.913 に答える
0

Ajax (実際には angularjs) 呼び出しを行ってインプレース編集選択フィールドに入力しようとしたときに、同様の問題が発生しました。

to_json の id 属性と name 属性が欲しくて、MissingAttributeError を取得し続けました。

モデルのメイン インデックスと show 呼び出しに使用される 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 に答える