Железнодорожный маршрут, если не найдено ни одного маршрута - PullRequest
1 голос
/ 11 ноября 2010

Есть ли решение для перенаправления пользователя на конкретное действие # контроллера, если не найдено ни одного маршрута? У меня было «последнее правило», подобное этому:

 match ":rest" => "application#notfound", :constraints => { :rest => /.*/ }

чтобы перенаправить все "другие" вещи в приложение # notfound. Проблема заключается в том, что плагины с собственными маршрутами, для которых установлено ниже правила shis и никогда не вызывается.

Ответы [ 4 ]

7 голосов
/ 12 ноября 2010

Создайте маршрут общего назначения и поместите его в качестве последнего правила в вашем файле rout.rb.

match "*rest" => "application#notfound"

вы также получите любой путь в качестве параметра через params[:rest] в вашем контроллере.

3 голосов
/ 12 ноября 2010

Вы определенно не единственный человек, имеющий эту проблему. Я знаю, это расстраивает, но дайте ему немного времени - я уверен, что команда Rails соберет что-то простое и элегантное. Я нахожусь в аналогичной позиции, только мне нужно знать неверный URL-ресурс, введенный пользователем.

Быстрый поиск в Google, и я обнаружил, что эта статья демонстрирует полное решение проблемы Rails 3.0 rescue_from ActionController :: RoutingError . Решение включает в себя Route Globbing и решает мою необходимость обрабатывать неверные URL-адреса и фиксировать введенный URL-адрес. Надеюсь, это поможет!

1 голос
/ 11 ноября 2010

Возможно, это не лучший подход, но он будет работать, пока вы не найдете лучшего решения

для рельсов 2.3, на контроллере приложения, поймать исключение как

rescue_from(ActionController::RoutingError) { redirect_to "/xpto" #add your code here }

Рельсы 3

В инициализаторе поставить код вроде:

module ActionDispatch
  class ShowExceptions
   def render_exception(env, exception)
     if exception.kind_of? ActionController::RoutingError
       render(500, 'it was routing error')
     else
       render(500, "some other error")
     end
   end
 end

конец

или что-то более чистое, например:

или:

match '/:anything', :to => "home#routing_error", :constraints => { :anything => /.*/ }

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

1 голос
/ 11 ноября 2010

Поместите это правило в последнюю очередь. Маршрутизация совпадений сверху вниз, поэтому, если совпадение найдено, оно останавливается там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...