Ruby on Rails: неопределенный метод `call'для nil:NilClass
Это линия, на которой он приземляется.
@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
и трассировка стека
/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'
почему я получил ошибку там?
я добавил
puts "||||||||||||||||||#{@object.name}"
и консоль показывает, что объект не nil.. =\
Журнал показывает:
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)
2 ответа
Как оказалось, эта ошибка произошла потому, что (в rails 2.3.8) я думаю, вы не можете установить datetime с date_select.
Поэтому я изменил свой f.date_select на f.datetime_select и заново сохранил дату, и все было хорошо.
Это означает... э-э... что вы пытаетесь вызвать метод "call" для объекта "nil".
Это происходит, когда вы используете объект, думая, что он должен быть vaild, то есть вместо ноля. Это может иметь место, например, если Object.find не может найти объект и возвращает "nil".
Тогда @object будет иметь значение "ноль", и вы не сможете рассматривать его так, как если бы он имел тип Object.
РЕДАКТИРОВАТЬ: всегда проверять, используя "ноль?" перед использованием объекта, который имеет неопределенное происхождение.