HTTP GET превращается в метод POST

Я использую Ruby on Rails для создания своего приложения и использую THIN сервер на heroku.

В настоящее время используется Rails 3.2.8

Я столкнулся с этим странным поведением, которое я не понимаю.

Ссылка была создана с помощью помощника link_to в навигационной панели. Я хочу явно использовать метод HTTP GET, чтобы мой код ruby ​​был написан так:

<%=link_to "FAQ",help_path,:method=> :get %>

В результате HTML выглядит так:

<a data-method="get" href="/en/help">FAQ</a>

Если я запускаю рейк-маршруты, help_path выглядит так:

help        (/:locale)/help(.:format)          static_pages#Help {:locale=>/en}

Однако, когда я смотрю на то, что происходит с URL-адресом в Firebug (используя вкладку Net), похоже, что вместо метода GET использовался POST. Так что вместо того, чтобы видеть:

GET help

это было замечено вместо этого:

POST help

Если я уберу явный вызов метода get следующим образом:

<%=link_to "FAQ",help_path %>

что приводит к этому:

<a href="/en/help">FAQ</a>

Тогда в firebug -> Net я даже не увижу этот URL: GET help

Под столбцом URL будет показано следующее:

? undefined 

Когда URL-адрес не определен, приложение Rails на heroku будет пытаться загрузить каждый файл ресурсов по отдельности, а не загружать предварительно скомпилированный файл ресурсов манифеста.

Кто-нибудь сталкивался с такой ситуацией? Я не могу точно понять, где в магическом черном ящике Rails, герою или тонком сервере может измениться метод get и post.

Любые предложения с благодарностью!

1 ответ

Решение

Я начну говорить, что не вижу причины, по которой нужно создать link_to и явно указать:get как метод:. В любом случае, это поведение по умолчанию.

На ваш вопрос: Вы видите запрос POST, потому что, когда вы используете опцию: method для link_to, он генерирует форму, которая отправляет на желаемый URL-адрес и скрытый ввод _method с желаемым типом запроса (POST/PUT/DELETE/GET). Rails знает, как обрабатывать запросы POST, которые содержат параметр _method, и отвечает правильным маршрутом. В вашем случае - маршрут, который соответствует действию GET.

Вы можете прочитать больше на link_to здесь.

РЕДАКТИРОВАТЬ:

Я прочитал документацию более тщательно, и похоже, что опция: method не поддерживает:get как значение.

Другие вопросы по тегам