Rails - какие-нибудь причудливые способы обработки 404? - PullRequest
7 голосов
/ 09 января 2011

У меня есть приложение rails, которое я создал для старого сайта, который я конвертировал из другого cms (на языке, отличном от rails, хе-хе).Большинство старых страниц сопоставляются с новыми страницами с помощью rout.rb.Но есть еще несколько 404-х.

Я новичок в рельсах, поэтому я спрашиваю, есть ли какие-нибудь продвинутые способы обработки 404-х.Например, если бы я программировал на своем старом языке, я бы сделал это:

  • Получите URL (имя_скрипта), к которому обращались, и проанализируйте его.
  • Выполните поиск в базе данных для любых ключевых слов, идентификаторов и т. Д., Найденных в новом URL.
  • Если найдено, перенаправьте на страницу (или, если найдено несколько записей, покажите их все настраница результатов и пусть пользователь выбирает).С рельсами я, вероятно, хотел бы сделать: status =>: Move_permanently, я предполагаю?
  • Если не найден, показать 404.

Есть ли какие-либо драгоценные камни / плагины илиучебники, о которых вы знаете, справятся с такой вещью, если это вообще возможно.Или вы можете на высоком уровне объяснить, как это можно сделать?Мне не нужен полный пример кода, просто толчок в правильном направлении.

PS.Это простое приложение rails 3, в котором используется одна модель контента.

Ответы [ 2 ]

7 голосов
/ 09 января 2011

Поместите это в маршруты (после каждого другого маршрута, который у вас есть, он будет захватывать каждый URL)

match '*url' => 'errors#routing'

И теперь в контроллере ошибок в действии маршрутизации вы можете реализовать любую причудливую логику, которую хотите, и визуализировать представление как всегда (вы можете добавить :status => 404 к вызову render). Запрошенный URL будет доступен в контроллере как params[:url].

0 голосов
/ 09 января 2011

Существует ужасный способ сделать это:

render :file => "#{RAILS_ROOT}/public/404.html", :layout => false, :status => 404

Может быть, кто-то может прийти с лучшим решением.

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