Есть ли в Rails способ извлечь HTTP-глагол (ы), связанный с маршрутом? Например, для такого маршрута:

match 'users', to: 'users#show', via: [:get, :post]

Могу ли я добиться чего-то подобного?

users_path.respond_to?(:get) (очевидно, что #respond_to - неправильный метод)

Самое близкое, что мне удалось сделать, - это сделать следующее, но на самом деле это не кажется удовлетворительным.

Rails.application.routes.routes.named_routes["users"].constraints[:request_method] # => /^GET$/

Для контекста у меня есть действие, которое устанавливает файл cookie, а затем выполняет redirect_to :back, но это действие доступно глобально для всего сайта (оно находится в нижнем колонтитуле). Таким образом, если пользователь находится в потоке, и один из этих маршрутов принимает только POST-запросы, перенаправление завершается ошибкой, поскольку выданный запрос является GET.

6
Marlorn 31 Дек 2013 в 09:46

2 ответа

Лучший ответ

Объект request доступен вашему контроллеру. Для определения типа HTTP-запроса доступны следующие методы:

if request.get?
  # request is a GET request
if request.post?
  # request is a POST request

Существуют аналогичные методы для других команд HTTP-запросов, включая PUT и DELETE.

ОБНОВЛЕНИЕ :

Согласно обновлению вопроса, следующий код может быть реализован в вашем контроллере, чтобы выдавать ограниченные глаголы на любом именованном маршруте в виде строки, разделенной конвейером:

Rails.application.routes.named_routes["users"].verb
#=> "GET|POST" 

Соответственно, вы можете разделить строку, чтобы получить массив каждого из методов HTTP, указанных в constraints маршрута:

methods_string = Rails.application.routes.named_routes["users"].verb
#=> "GET|POST"

methods_array = methods_string.split('|')
#=> ["GET", "POST"]

methods_array[0]
#=> "GET"
methods_array[1]
#=> "POST"
8
zeantsoi 31 Дек 2013 в 06:43

Для тех, кто ищет его в будущем, вы можете использовать

env["REQUEST_METHOD"]

Чтобы получить HTTP-глагол определенного действия

1
Jomar Gregorio 7 Мар 2016 в 03:55