Ruby on Rails: método indefinido `call ‘para nil: NilClass

Esta es la línea en la que aterriza.

@object = Object.find(params[:id]) respond_to do |format| if @object.update_attributes(:status=>Object::PUBLISHED, :published_at => Time.now) format.html { redirect_to :action => :publish_detail } format.xml { head :ok } format.json { head :ok } #else # flash[:error] = 'There was a problem updating your object.' # format.html { redirect_to :action => "publish_detail" } # format.xml { render :xml => @object.errors, :status => :unprocessable_entity } # format.json { render :json => @object.errors, :status => :unprocessable_entity } end end 

y el rastro de la stack

 /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support/whiny_nil.rb:52:in `method_missing' /opt/local/lib/ruby/gems/1.8/gems/actionpack-2.3.8/lib/action_controller/mime_responds.rb:175:in `respond' /opt/local/lib/ruby/gems/1.8/gems/actionpack-2.3.8/lib/action_controller/mime_responds.rb:173:in `each' /opt/local/lib/ruby/gems/1.8/gems/actionpack-2.3.8/lib/action_controller/mime_responds.rb:173:in `respond' /opt/local/lib/ruby/gems/1.8/gems/actionpack-2.3.8/lib/action_controller/mime_responds.rb:107:in `respond_to' .../app/controllers/objects_controller.rb:252:in `publish' 

¿Por qué me da un error?

yo añadí

 puts "||||||||||||||||||#{@object.name}" 

y la consola muestra que el objeto no es nulo … = \

El registro muestra:

 NoMethodError (undefined method `call' for nil:NilClass): app/controllers/objects_controller.rb:252:in `publish' Rendered rescues/_trace (26.1ms) Rendered rescues/_request_and_response (1.1ms) Rendering rescues/layout (internal_server_error) 

Significa … uh … que está intentando llamar al método “call” en un objeto “nil”.

Esto sucede cuando usas un objeto pensando que debería ser una versión, que en su lugar es nula. Este puede ser el caso, por ejemplo, si Object.find no puede encontrar el objeto y devuelve “nil”.

@object será entonces “nil” y no puede tratarlo como si fuera de tipo Object.

EDITAR: siempre comprobar utilizando “nil?” Antes de usar un objeto de procedencia incierta.

Al final resultó que, este error estaba ocurriendo porque (en los Rails 2.3.8) supongo que no se puede establecer una fecha y hora con un date_select.

Así que cambié mi f.date_select a f.datetime_select y volví a guardar la fecha, y todo fue bien.