Подтвердить что ты не робот

Странная ошибка "406 неприемлема"

Когда я пытаюсь нажать это действие с помощью 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

Это из jQuery, но я делаю правильно перед отправкой:

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

Вот мои заголовки запросов:

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
4b9b3361

Ответ 1

Я взломал случай!

Я отправлял параметр format с моим запросом на получение, чтобы сообщить серверу отправить мне уценку вместо HTML. Вот мой Javascript:

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

а затем я искал этот параметр в блоке format.js:

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

но, по-видимому, параметр format смущает блок respond_to. Я изменил его с {format: 'raw'} на {markdown: 'true'}, и он работает.

Я предполагаю, что это ошибка в Rails?

Ответ 2

включить "format.js" в блок response_to

Ответ 3

Это случилось со мной при использовании HTTPRiot подключения к веб-приложению JSON-рендеринга из приложения iPhone. Похоже, что проблема связана с тем, что Rails ожидает HTTP-заголовок Accept, что ему хорошо, удобно. Как таковой, я использовал расширение Firefox LiveHTTPHeaders, чтобы увидеть, какие заголовки работают без 406. В любом случае строка Accept, которая работала, была:

text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Еще одна область, которую я рассмотрю, - контроллер JSON. Если у контроллера отсутствует директива формата для указания, он может вернуть JSON в ответ, это также может вызвать ошибку 406.

Ответ 4

Проверьте ваш application.js для запроса jquery_ujs

//= require jquery_ujs

Ответ 5

Можете ли вы попробовать без установки заголовка Accept? Он должен работать даже без заголовка Accept.

Ответ 6

Просто используйте этот код в блоке формата метода действия контроллера:

format.js   { render :nothing => true }  

Ответ 7

Проходит ли это через Apache? Вы можете взглянуть на http://forums.alwayswebhosting.com/showthread.php?p=8381, в котором описываются сценарии, в которых политика безопасности мешает запросам.

EDIT. Указанный выше URL-адрес защищает политику защиты запросов от вторжения по всему сайту, что делает сайт уязвимым. Установка опции SecFilterEngine на Off в .htaccess, которая предписывается в URL-адресе, должна быть сделана только нулевой в источнике проблемы. Это не следует рассматривать как долгосрочное решение.

Ответ 8

Если вы используете jRails, это вызывает множество проблем для меня, вот мой application.js файл:

$(document).ready(function () {
    $.ajaxSetup({
        beforeSend: function (xhr) {
            xhr.setRequestHeader("Accept", "text/javascript, text/html, application/xml, text/xml, */*");
        }
    });
});

Ответ 9

Для меня это был простой before_filter, который ограничивал действие, которое отображает js файл, как только я добавил: except = > [: action] в блок before_filter, это было нормально.

Ответ 10

Я ударил эту проблему, когда забыл добавить :remote => true в мою форму Ajax.

Ответ 11

Я вызывал url для js-формата, но имел это в контроллере:

respond_to do |format|
  format.html 
end

это отлично работало в Safari, но не с Firefox.

Естественно, я что-то упустил, должен быть:

respond_to do |format|
  format.html
  format.js
end

и теперь оба браузера в порядке.

Ответ 12

Другой коварный "Gotcha" здесь, если вы вызываете своего контроллера с помощью form_for, у которого случайно есть дополнительный необязательный параметр. Дополнительный параметр может быть интерпретирован Rails как запрос формата, и вы получите 406.

Пример:

= form_for parking_permit, url: permit_group_parking_permits_path(@permit_group.id, useless_id), method: :get do |f| ...

В приведенном выше примере вы RAKE ROUTES и определяете, что для параметра allow_group_parking_permits_path НЕ требуется ничего, кроме идентификатора allow_group...

Если вы видите, что ваш метод вызывается, например /model/action.1?blahblahblah, что ".1" является вашим советом.

Это вернет 406. Мы не будем говорить о том, сколько времени я потратил на это раз.