Странная ошибка "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
Ответы
Ответ 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. Мы не будем говорить о том, сколько времени я потратил на это раз.