Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Weird "406 not acceptable" error

When I try to hit this action via Javascript, I get a 406 Not Acceptable error:

  def show     @annotation = Annotation.find_by_id(params[:id])      respond_to do |format|       format.html {          if @annotation.blank?            redirect_to root_path          else            redirect_to inline_annotation_path(@annotation)          end        }         format.js {          if params[:format] == "raw"            render :text => @annotation.body.to_s          else            render :text => @annotation.body.to_html          end        }     end   end 

This is from jQuery, but I'm doing the right beforeSend stuff:

  $.ajaxSetup({      beforeSend: function(xhr) {       xhr.setRequestHeader("Accept", "text/javascript");     },     cache: false    }); 

Here are my request headers:

Host    localhost:3000 User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 Accept  text/javascript 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  300 Connection  keep-alive X-Requested-With    XMLHttpRequest Content-Type    application/x-www-form-urlencoded 
like image 456
Tom Lehman Avatar asked Sep 12 '09 06:09

Tom Lehman


People also ask

What does 406 not acceptable mean?

The HyperText Transfer Protocol (HTTP) 406 Not Acceptable client error response code indicates that the server cannot produce a response matching the list of acceptable values defined in the request's proactive content negotiation headers, and that the server is unwilling to supply a default representation.

What is Error 406 in Project Makeover?

A 406 Error – Not Acceptable will return if the file format is not supported by the server.


1 Answers

I cracked the case!

I was sending a format parameter with my get request in order to tell the server to send me markdown instead of HTML. Here's my Javascript:

$.get("/annotations/" + annotation_id, {format: 'raw'}, function(data) { }); 

and then I was looking for this parameter in the format.js block:

   format.js {      if params[:format] == "raw"        render :text => @annotation.body.to_s      else        render :text => @annotation.body.to_html      end    } 

but apparently a format parameter confuses the respond_to block. I changed it from {format: 'raw'} to {markdown: 'true'} and it works.

I guess this is a bug in Rails?

like image 109
Tom Lehman Avatar answered Oct 03 '22 03:10

Tom Lehman