update rails generate create and active ruby-on-rails ruby activemodel

ruby-on-rails - generate - update en rails



ActiveModel:: MissingAttributeError se produce después de la implementación y luego desaparece después de un tiempo (7)

Tengo una aplicación Rails 3.0.9 que, una vez implementada, sufre de un montón de ActiveModel :: MissingAttributeErrors que surgen y causan 500s Los errores ocurren de manera bastante aleatoria, a veces una página se carga, otras no, pero los atributos son todos atributos existentes en la base de datos y deben encontrarse.

Lo extraño es que después de un tiempo, los errores desaparecen. De repente, dejan de causar un problema.

He buscado una solución para esto, pero este error se produce principalmente cuando alguien ha hecho Model.all(:select => ''column_x,column_y'') y está pidiendo column_z o cuando está usando cache_money. No estoy haciendo ninguna de estas cosas.

¿Alguien puede ayudar?


Encontré una toma interesante sobre esto que resultó en el mismo error. En un intento de reutilizar el código, clasificamos una clase de presentadores con una clase de presentadores que realiza una agrupación para usar en una vista de gráfico.

Para simplificar, fue algo como:

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

El agregador hizo algo como lo siguiente para construir una tabla de publicaciones por día:

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

Una llamada a "group_query" da como resultado un ActiveModel :: MissingAttributeError, ya que creo que el intento de "incluye" Wombat falla porque "wombat_id" no estaba en los atributos incluidos en la "selección".

Sin embargo, es probable que esta no sea su respuesta, ya que ocurre independientemente de si la memoria caché está habilitada o no.


Me encontré con este problema. Asegúrese de que su select: incluya todos los campos a los que se hace referencia en su vista, incluidos los identificadores de relación y los atributos llamados dentro de sus métodos.

El atributo faltante puede ser difícil de identificar siempre que sus vistas y relaciones sean complejas. La forma más fácil de depurar esto es eliminar la parte select de su cláusula where y ver si la consulta / alcance / método se ejecuta correctamente. Si es así, agregue todos los atributos a la select y elimine los atributos innecesarios uno a la vez hasta que encuentre el atributo ofensivo.


Probablemente tenga una consulta que no devuelva todas las columnas (es decir, use :select ) y luego cache_money; o algún otro complemento de ActiveRecord utiliza una after_initialize llamada after_initialize , que se ejecuta cada vez que se crea un nuevo objeto ActiveRecord (es decir, cuando se obtiene de la base de datos).

En esa inicialización de devolución de llamada, algo intenta acceder o usar un atributo que no estaba incluido en :select . Se esperaría que esto devolviera un valor nulo para ese atributo, pero en su lugar se lanza un ActiveRecord :: MissingAttributeError.

Puede rescatar ActiveRecord :: MissingAttributeError como sugiere el artículo, o parchear el (los) complemento (s) para usar has_attribute?(:attribute_name) antes de que intenten acceder o modificar el atributo.


Si ha tenido este problema solo directamente después de actualizar su base de datos sin implementaciones o reinicios de servidor siguientes, entonces lo que funcionó para mí puede funcionar para usted:

Ejecute el heroku restart y debería ser arreglado. Antes de que Dyno reinicie, los datos antiguos a veces permanecen en caché en el servidor, por lo que volver a iniciarlos borrará todos esos datos y evitará que se produzcan errores de ese tipo. Espero que esto ayude.


Un problema similar me molestaba cuando intentaba realizar llamadas Ajax (en realidad, angularjs) para rellenar campos de selección de edición in situ.

Solo quería una identificación y nombres de atributos para json y seguí obteniendo el error MissingAttributeError.

Me di cuenta de que tenía un método as_json en el modelo que se usa para el índice principal y muestra las llamadas en el modelo. Básicamente, fue el as_json que no estaba viendo los atributos que esperaba.

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

dio el error pero

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

Parece estar funcionando. Estaba cerca de analizarlo, pero encontré una gran explicación en.

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


necesitas agregar linea

rescue ActiveRecord::MissingAttributeError

en su método after_initialize () del modelo


.to_json esto agregando .to_json al final de mi procesamiento del controlador.