Рельсы по всему маршруту

Я использую rails 3.0.14, и я создаю route.rb, используя изобретательный стиль. Я хотел бы иметь подстановочный маршрут, который ловит все запросы, которые не соответствуют указанному маршруту.

Каким образом можно построить такой маршрут?

Ответы

Ответ 1

ставить

match '*path' => 'your_controller#your_action'

в конце файла route.rb. Это важно, поскольку маршруты проходят сверху вниз.

См. также http://guides.rubyonrails.org/routing.html → 3.10

Ответ 2

Для Rail 4 вам нужно указать тип запроса:

match "*path", to: "application#custom_action", via: :all

Как говорили другие, поставьте это в самом низу вашего файла маршрутов.

Ответ 3

Не обязательно использовать именно "путь" в инструкции match '*path'. Вы можете установить там любой токен:

get "*string1"

или

get "*string2"

Rails назначит ваш реальный HTTP-запрос параметру, названному после вашего токена, например:

get "*user" => "users#show"

в консоли:

Started GET "/john" ....  
Processing by UsersController#show as HTML 
Parameters: {"user"=>"john"}

Вы можете использовать несколько звездочек, например get "*id*user". Но в этом случае вы получите непредсказуемый результат, потому что Rails обрабатывает 2 или более звездочки "интуитивным способом" - для получения дополнительной информации см. http://guides.rubyonrails.org/routing.html#route-globbing-and-wildcard-segments

Ответ 4

В дополнение к @steel и @awenkhh, я рекомендую добавить следующее к этому действию контроллера маршрута

respond_to do |format|
  format.html
  # other formats you already support
  format.all { render text: '' }
end

В противном случае вы столкнетесь с некоторыми ошибками ActionView::MissingTemplate: Missing template для форматов, которых вы не ожидали.

[rant] Особенно полезно для тех, кто пытается ошибочно атаковать векторы вокруг /wp-admin/css/wp-admin.css и тому подобное. Кажется, я получаю около 100 запросов для /wp-admin/* в день, от супер раздражающих людей, которые, по-видимому, хотели бы, чтобы я получил более дорогой план счетов Rollbar. [/Rant]