2008-09-18 9 views
21

He visto este problema surgir en muchas circunstancias diferentes y me gustaría obtener las mejores prácticas para corregirlo/corregirlo en StackOverflow.Cómo arreglar/depurar 'esperado x.rb para definir X.rb' en Rails

Para utilizar un ejemplo del mundo real esto se me ocurrió esta mañana:

expected announcement.rb to define Announcement 

La clase funcionó bien en el desarrollo, prueba y desde una consola de producción, pero fallaron en una producción de mestizo. Aquí está la clase:

class Announcement < ActiveRecord::Base 
    has_attachment :content_type => 'audio/mp3', :storage => :s3 
end 

El tema que quisiera abordar en las respuestas no es resolver tanto este problema específico, pero cómo depurar correctamente para obtener los carriles para darle un error significativo como se esperaba para definir x.rb X.rb' es a menudo una cortina de humo ...

Editar (3 grandes respuestas hasta ahora, cada w/una solución parcial)

Depuración:

  1. De Joe Van Dyk: Intente acceder al modelo a través de una consola en el entorno/instancia que está causando el error (en el caso anterior: script/console production escriba 'Anuncio').

  2. De Otto: Intente establecer un conjunto de complementos mínimo mediante un inicializador, por ejemplo: config.plugins = [: exception_notification,: ssl_requirement,: all] y luego vuelva a habilitarlos de uno en uno.

causas específicas:

  1. De Ian Terrell: si está utilizando attachment_fu asegúrese de que tiene instalado el procesador de imagen correcta. attachment_fu lo requerirá incluso si no está adjuntando una imagen.

  2. De Otto: asegúrese de no nombrar un modelo que entra en conflicto con una clase incorporada de Rails, por ejemplo: Solicitud.

  3. De Josh Lewis: asegúrese de que no tiene nombres duplicados de clase o módulo en algún lugar de su aplicación (o lista de gemas).

+0

He estado teniendo el mismo problema con las tareas de rake en producción. Aquí está la mejor solución que he encontrado: http://www.spacevatican.org/2008/12/28/when-cache_classes-gets-you-down/ – user1902430

Respuesta

11

Eso es complicado.

Lo que generalmente funciona para mí es ejecutar "producción/consola de guión" en el servidor de producción, y escribe:

Announcement

Que por lo general le dará un mensaje de error mejor. ¿Pero dijiste que ya lo intentaste?

+0

Buen comienzo, vale la pena una votación. ¿Pero cómo depurar el caso donde el error solo ocurre a través de Mongrel? –

+0

No estoy usando complementos y tengo este error en modo de desarrollo. – jesper

+0

Dar un voto positivo, no es suficiente, ¡solo me salvaste! ¡Gracias! – Honza

2

He encontrado esto antes, y el complemento AttachmentFu era el culpable. Creo que en mi caso fue debido a AttachmentFu esperando un procesador de imagen diferente de lo que estaba disponible, o también se instalaron versiones no compatibles.El problema se resolvió cuando agregué explícitamente :with => :rmagick (o similar, estaba usando RMagick) al método has_attachment llame al incluso para archivos adjuntos que no sean imágenes. Obviamente, asegúrese de que su entorno de producción tenga todas las gemas correctas (o congélelas en su aplicación) y soporte de software (ImageMagick) instalado. YMMV.

En cuanto a no obtener Rails y AttachmentFu para chupar y ocultar el error real, lo solucionamos antes de resolverlo por completo.

+0

Buena información adicional, pero no una respuesta completa ... Creo que el uso de la técnica de prueba de joevandyk desde una consola le hubiera dado un mejor mensaje de error. –

1

Puede intentar deshabilitar todos sus complementos y volver a agregarlos uno por uno.

En environment.rb en la sección Initalizer, añada una línea como la siguiente:

config.plugins = [ :exception_notification, :ssl_requirement, :all ] 

de inicio con el mínimo establecido para ejecutar la aplicación y añadirlos de uno en uno. Normalmente obtengo este error cuando definí un modelo que se asigna a un nombre de archivo existente. Por ejemplo, un modelo de Solicitud, pero Rails ya tiene un request.rb que se carga primero.

1

he tenido este problema durante un tiempo y en mi caso, el error siempre estuvo precedida de este error S3:

(AWS::S3::Operation Aborted) "A conflicting conditional operation is currently in progress against this resource. Please try again."

Este problema suele producirse cuando se crea el mismo cubo una y otra vez. (Fuente AWS Developers forum)

Esto se debió al hecho de que había utilizado attachment_fu to crear el cubo y que había decommented la línea que contiene el comando Bucket.create(@@bucket_name) en lib/technoweenie/attachment_fu/backends/s3_backends.rb (cerca a la línea 152).

Una vez que se comentó o eliminó el comando Bucket.create(@@bucket_name), el problema desapareció.

Espero que esto ayude.

0

en mi caso, estoy consiguiendo este error en la consola de desarrollo, sino que se puede cargar en la clase IRB

0

sentimos que esto no es una respuesta definitiva, pero otro enfoque que podría trabajar en alguna circunstancia específica:

Acabo de ejecutar este problema al depurar un sitio con Ruby 1.8.7 y Merb 1.0.15. Parecía que la clase en cuestión (llamémosla SomeClass) estaba cayendo fuera del alcance, pero cuando el archivo some_class.rb se cargaba automáticamente, el mecanismo require no cargaba los demás archivos que requería (some_class/base.rb, etc.). Posiblemente un error en require?

Si solicité some_class file anteriormente, como el final de environment.rb, parece que impide que el objeto se salga del alcance.

0

Estaba obteniendo este error duo a una definición de controlador en un archivo que no se nombró como controlador. Por ejemplo, tiene un modelo de comentario y define el controlador en un archivo comment.rb en lugar de comments_controller.rb

2

Dado que este sigue siendo el principal resultado de Google, pensé en compartir lo que me solucionó el problema:

Tenía un módulo en la carpeta lib con exactamente el mismo nombre que mi aplicación. Entonces, tuve un conflicto en los nombres de los módulos, pero también tuve un conflicto con los nombres de las carpetas (aunque no estoy seguro si este último realmente hace la diferencia).

Por lo tanto, para el OP, asegúrese de no tener nombres duplicados de clase o módulo en alguna parte de su aplicación (o lista de gemas).

1

Cambio de nombres de clases durante el uso de ITS causada por mí:

  • Clase cambiado de 'EDBeneficiary' a
  • Los registros existentes 'EdBeneficiary' tenía 'EDBeneficiary' columna almacenada en el 'tipo', por lo que cuando Rails intentó cargarlos, la excepción se planteó.

Solución: ejecute una migración para actualizar los valores en la columna "tipo" para que coincida con el nuevo nombre de clase.

0

Tuve este problema con los rieles versión 1.2.3. Podría reproducir el problema solo con mongrel, usar el acceso al entorno de la consola no proporcionaba ninguna información útil. En mi caso, he resuelto hacer la carpeta RAILS_ROOT/html puede ser escrito por mestizo y luego reiniciar el servidor web, ya que algunos usuarios reportaron aquí:

http://www.ruby-forum.com/topic/77708

2

Para mí, la causa fue una dependencia circular en mis definiciones de clases , y el problema solo apareció usando autotest en Rails. En mi caso, no necesitaba la dependencia circular, así que simplemente la eliminé.

2

Acabo de encontrar este error también.

En resumen, mi archivo rb en mi carpeta lib no estaba en una estructura de carpetas que coincidiera con la convención de nomenclatura de mi módulo. Esto hizo que el cargador automático ActiveSupport utilizara el módulo incorrecto para ver si mi constante de clase estaba definida.

Específicamente me había definido la siguiente clase

module Foo 
    class Bar 
    end 
end 

En la raíz de /lib/bar.rb

Esto hizo que el cargador automático para preguntar si el módulo de objeto Barra se definió en lugar de módulo de Foo.

Al mover mi archivo rb a /lib/foo/bar.rb solucionado el problema.

0

Cuando actualicé los rieles de 1.1.6 a 1.2.6 y 2.0.5 para mi aplicación, me enfrenté a este error. En resumen, los complementos antiguos causaron este error. Estos complementos ya estaban obsoletos y ya no hay actualizaciones (¡incluso no hay repositorio!). Después de eliminarlos, la aplicación funcionó en 1.2.6 y 2.0.5. Pero no revisé el código fuente detallado de los complementos.