Completed 406 Not Acceptable

After migrating my 2.3.9 app to rails 3.0.0 I get this error:

      Completed 406 Not Acceptable in 513ms

I also noted that processing controller doesn't output the protocol:

-- Processing by Admin::PhotographersController#update as

while if it works, say:

-- Processing by Admin::PhotographersController#update as HTML

Here is the full action output http://pastie.org/1187051

Can anyone help me, please ? Don't know where to start :frowning:

Luca

After migrating my 2.3.9 app to rails 3.0.0 I get this error:

  Completed 406 Not Acceptable in 513ms

I also noted that processing controller doesn't output the protocol:

-- Processing by Admin::PhotographersController#update as

while if it works, say:

-- Processing by Admin::PhotographersController#update as HTML

Here is the full action outputhttp://pastie.org/1187051

Can anyone help me, please ? Don't know where to start :frowning:

At a guess it's because the url being posted to is /admin/photographer. 1 which may be making part of rails think that the requested format is .1 (as opposed .html, .xml etc), so when you get to your respond_to block rails can't generate a response and so generates a 406 instead (which is http for "I can't generate the kind of response you asked for")

Fred

It's goes through Admin::PhotographersController#edit action, opening a form which I have to fill:

  def edit     @photographer = current_photographer   end

then it goes to Admin::PhotographersController#update :

  def update     @photographer = current_photographer     if params[:id]       # trying to update a specific photographer on a singular resource is a no-no       flash[:notice] = "You can only update your own settings!"       redirect_to edit_resource_path     else       update!{ edit_resource_path }     end   end

here is the controller http://pastie.org/1189038 and here it is the view http://pastie.org/1189061 ( ... or, follow a snap )

= form_for(:photographer, @photographer, :url => resource_path, :html => { :multipart => true, :method => :put }) do |f| ... ...     %p       = f.label :theme       = f.select :theme, Photographer.themes     %p       = f.label :use_watermark, "Automatically watermark your client photos?"       = f.check_box :use_watermark ...

Luca

... ok, this is the piece of log which works ( Rails 2.3.8 )

[paperclip] Saving attachments. SQL (49.3ms) COMMIT Redirected to http://localhost:3000/admin/photographer/edit Completed in 223ms (DB: 0) | 302 Found [http://localhost/admin/ photographer]

after migrating to Rails 3.0.0 I get this:

[paperclip] Saving attachments. SQL (595.4ms) COMMIT Completed 406 Not Acceptable in 812ms

so I guess the failing code in my controller Admin::PhotographersController#update is

      redirect_to edit_resource_path

... any suggestion ? How can I procede troubleshooting ?

Thanks in advance Luca

I agree with Fred. What does your 'Accept' header in your browser say for the request that throws the 406? eg. Accept:text/css Also, check the content-type in the response headers. You could grab this information using the developer console in safari or chrome, or firebug in firefox.

I saw something very similar which affect Firefox, but not Safari or Chrome.

Luke

I'm not sure to have the competence to fully understand your & Frederick question, so please, could you tell me how/where can I check that ?

Thanks in advance Luca

I'm not sure to have the competence to fully understand your & Frederick question, so please, could you tell me how/where can I check that ?

I'd check what the url the form posts to is - does it look right? (ie view the html produced by the edit form)

Fred

No it's wrong, it is a POST to http://localhost:3000/admin/photographer.1 and tha page doesn't show up, it's blank.

In case of Rails 2.3.8 I get - Processing Admin::PhotographersController#update (for 127.0.0.1 at 2010-09-29 19:19:38) [PUT] - instead of POST and than redirect back to http://localhost:3000/admin/photographer/edit

Here a vision of the failure, Firebug side:

POST photographer.1 http://localhost:3000/admin/photographer.1 406 Not Acceptable localhost:3000 1 B

Response Headersview source x-ua-compatible IE=Edge Connection Keep-Alive Content-Type text/html; charset=utf-8 Date Thu, 30 Sep 2010 12:09:14 GMT Server WEBrick/1.3.1 (Ruby/1.8.7/2010-08-16) X-Runtime 0.849066 Content-Length 1 Cache-Control no-cache Set-Cookie _lauranovara_session=xxxxx .....; path=/; HttpOnly

Request Headersview source Host localhost:3000 User-Agent Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.10) Gecko/ 20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language en-us,en;q=0.5 Accept-Encoding gzip,deflate Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive 115 Connection keep-alive Referer http://localhost:3000/admin/photographer/edit Cookie txtMainTab=Timeline; _lauranovara.com_session=xxxxxxxx ....

No it's wrong, it is a POST tohttp://localhost:3000/admin/photographer.1 and tha page doesn't show up, it's blank.

I'd start by finding out why the url generated ends in .1. Something funny in your routes maybe?

Fred

... yes, first thing I did before my very first post, anyway, can't understand what's wrong with it :

Rails 2.3.8 :

  map.namespace :admin do |admin|     # session / login / logout     admin.resource :photographer_session     admin.login '/login', :controller => "photographer_sessions", :action => "new"     admin.logout '/logout', :controller => "photographer_sessions", :action => "destroy"     admin.resource :photographer     admin.resources :photographer_password_resets   ...

Rails 3.0.0 :

  namespace :admin do     # session / login / logout       resource :photographer_session       match '/login' => 'photographer_sessions#new', :as => :login       match '/logout' => 'photographer_sessions#destroy', :as => :logout       resource :photographer       resources :photographer_password_resets ...

everything seems ok with the new sintax ..., well I think so, anyway here what "rake routes" show up for admin photographer in both Rails 2.3.8 http://pastie.org/1191253 and Rails 3.0.0 http://pastie.org/1191246

... yes, first thing I did before my very first post, anyway, can't understand what's wrong with it :

Rails 2.3.8 :

  map.namespace :admin do |admin|     # session / login / logout     admin.resource :photographer_session     admin.login '/login', :controller => "photographer_sessions", :action => "new"     admin.logout '/logout', :controller => "photographer_sessions", :action => "destroy"     admin.resource :photographer     admin.resources :photographer_password_resets   ...

Rails 3.0.0 :

  namespace :admin do     # session / login / logout       resource :photographer_session       match '/login' => 'photographer_sessions#new', :as => :login       match '/logout' => 'photographer_sessions#destroy', :as => :logout       resource :photographer       resources :photographer_password_resets ...

everything seems ok with the new sintax ..., well I think so, anyway here what "rake routes" show up for admin photographer in both Rails 2.3.8 http://pastie.org/1191253 and Rails 3.0.0 http://pastie.org/1191246

Given the following:

= form_for(:photographer, @photographer, :url => resource_path, :html => { :multipart => true, :method => :put }) do |f| ...

and

Rails 3.0.0 :

namespace :admin do    # session / login / logout      resource :photographer_session      match '/login' => 'photographer_sessions#new', :as => :login      match '/logout' => 'photographer_sessions#destroy', :as => :logout      resource :photographer      resources :photographer_password_resets   end

Should resource path be something else like admin_photographer_path ? I'm just guessing, but I'd also look at removing the :photographer and :method => :put from the form_for line. I think it's import to sort out why your URL is generating incorrectly before we troubleshoot the content type issue. For example, it might be thinking that .1 is a suffix just like .html or .css and is setting the resource type based on that.

Also regarding checking the headers. I'll assume you're using or can use chrome. Look under the View menu -> Developer -> Developer tools. Click on the first item under resources (which should say 406) and click on the headers tab. Here you can find the accept and content type headers.

Luke

Good point Luke, thank you.

I changed to admin_photographer_path as you suggested and it can pass the redirection. Anyway something strange is still going on here:

1) it redirect to http://localhost:3000/admin/photographer/edit.1

there's still that .1 which smell of .:format mismatching ...

2) I've tons of that form_for(:name, @name, :url => resource_path, :html => { :multipart => true, :method => :put }) do | f>

which are working just fine:

lsoave@ubuntu:~/rails/altrove/lauranovara$ find . -exec grep ":url => resource_path, :html => { :multipart => true, :method => :put })" {} \; -print|grep ^./ ./app/views/admin/photos/edit.html.haml ./app/views/admin/photographers/edit.html.haml ./app/views/admin/galleries/edit.html.haml ./app/views/admin/bookings/edit.html.haml ./app/views/admin/quotes/edit.html.haml ./app/views/admin/products/edit.html.haml ./app/views/admin/pages/edit.html.haml ./app/views/admin/gallery_photos/edit.html.haml ./log/development.log lsoave@ubuntu:~/rails/altrove/lauranovara$

3) the old 2.3.8 used to work like that with same routing logic ...

Even if this make me able to going on, I'd really would like to figure out what makes me .1 tail :slight_smile: Until now, I've no idea about why my URL is generating incorrectly ...

Many thanks to Luke and Frederick for your precious suggestions Luca G.Soave