奇怪的"406不可接受"的错误

Tom*_*man 41 ruby-on-rails

当我尝试通过Javascript尝试此操作时,出现406 Not Acceptable错误:

  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
Run Code Online (Sandbox Code Playgroud)

这是来自jQuery,但我在发送之前做的正确:

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

这是我的请求标题:

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
Run Code Online (Sandbox Code Playgroud)

Tom*_*man 30

我破了这个案子!

我正在format使用我的get请求发送一个参数,以告诉服务器向我发送markdown而不是HTML.这是我的Javascript:

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

然后我在format.js块中寻找这个参数:

   format.js {
     if params[:format] == "raw"
       render :text => @annotation.body.to_s
     else
       render :text => @annotation.body.to_html
     end
   }
Run Code Online (Sandbox Code Playgroud)

但显然一个format参数会混淆respond_to块.我从改变它{format: 'raw'}{markdown: 'true'}和它的作品.

我想这是Rails中的一个错误?

  • 这不是一个错误,而是预期的行为:Rails使用Accept Headers和format参数来确定是否使用html,javascript,xml,json或其他内容进行响应.所以在你的情况下,format.js {}块从未被调用,因为Rails认为你想要的格式是"raw"而不是格式为"js"的东西. (10认同)
  • 你是对的 - 我应该注册一个Markdown mimetype(http://stackoverflow.com/questions/2456219/add-a-custom-format-in-rails-that-will-work-with-respond-to)添加了`format.markdown`块 (2认同)

小智 5

在respond_to块中包含"format.js"


yuv*_*alz 5

当使用HTTPRiot从iPhone应用程序连接到JSON渲染Web应用程序时,这种情况发生在我身上.似乎问题是由于Rails期望AcceptHTTP标头很好,很舒服.因此,我使用Firefox的LiveHTTPHeaders扩展来查看没有406的头文件.在任何情况下,有效的Accept字符串是:

text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Run Code Online (Sandbox Code Playgroud)

我要研究的另一个领域是产生JSON的控制器.如果控制器缺少一个format指令来指定它可以返回JSON作为响应,那么也可能导致406错误.