2012-06-26 4 views
10

Estoy siguiendo el tutorial de Kevin Skoglund Ruby on Rails 3 Essential Training, que fue escrito para Rails 3.0, aunque actualmente estoy usando 3.2. Utiliza el siguiente método en el pages_controller con un before_filter para mostrar solo las páginas que pertenecen al tema principal.Rails 3.0/3.2: Id llamada para nil, que sería erróneamente 4 - si realmente deseaba el id de nil, use object_id

El tutorial usa explícitamente .find_by_id porque si el resultado es nulo, "no devolverá un error". Sin embargo, obtengo el "Id. Llamado para nulo", que erróneamente sería 4, si realmente deseaba el error "Id of nil, use object_id" cuando intenta ver una página donde @subject se ha establecido en nil.

def find_subject 
    if params[:subject_id] 
    @subject = Subject.find_by_id(params[:subject_id]) 
    end 
end 

El código real que está causando el error es:

def list 
    @pages = Page.order("pages.position ASC").where(:subject_id => @subject.id) 
end 

Es esto algo que ha cambiado desde 3.0? Si es así, ¿cuál sería la forma correcta de implementar esta funcionalidad en 3.2?

Respuesta

11

el mensaje:

"Identificación de Llamada nula, lo que erróneamente ser de 4 - si realmente quería el id de cero, utilice object_id"

Es el mensaje estándar en Rails que indica que ha intentado invocar .id en un valor nil.

Así que si @subject es nulo, entonces es normal, el comportamiento apropiado para obtener ese mensaje si intenta llamar al @subject.id.

Recomendaría que en el archivo de vista tenga en cuenta que @subject puede ser y abordarlo en la forma en que presenta la información. Mire el código y piense qué debe presentar en la vista si @subject es nil.

2

Al no haber visto el código con el que está trabajando, podría estar equivocado. Pero ¿debería utilizar

params[:id] 

Para una comprobación rápida, sólo hay que poner esto antes de la sentencia if:

puts ">>> #{params[:subject_id]}" 

Si se le da la ID, me equivoco ...

0

Es probable que el código que pegó no arroje ese error. En su opinión, probablemente esté mostrando @subject.id que arrojará ese error. Debería obtener un seguimiento de pila que le proporcione la línea exacta en la que se encuentra el problema.

+0

actualizó la pregunta con el código que muestra el error – Nick5a1

Cuestiones relacionadas