Как я могу создать маршрут Rails 3, который будет соответствовать всем запросам и напрямую на один ресурс / страницу?

17

У меня есть приложение rails (Rails 3.0), которое мне нужно временно вывести из строя. Пока это действует, я хочу создать новый маршрут, который будет направлять все запросы на один кусок статического контента. У меня есть контроллер, настроенный для обслуживания моих статических страниц.

Я пробовал что-то вроде этого:

match '*' => 'content#holding'

и

match '*/*' => 'content#holding'

, чтобы соответствовать шаблону подстановочных знаков, как описано здесь: Rails 3 route globbing без успеха.

Это, вероятно, очень простой ответ, но я не мог понять.

/ <ет> ИЗМЕНИТЬ / Забыл упомянуть, что у меня было это правило в самом верху моего файла route.rb.

    
задан Nick 30.12.2011 в 15:24
источник
  • Вы поместили этот маршрут в самый верх файла ваших маршрутов? –  Robin 30.12.2011 в 15:26

4 ответа

39

Rails необходимо связать параметры url с переменной, попробуйте следующее:

match '*foo' => 'content#holding'

Если вы также хотите сопоставить / , используйте скобки, чтобы указать, что foo не является обязательным:

match '(*foo)' => 'content#holding'
    
ответ дан klochner 30.12.2011 в 16:06
источник
  • Кажется, что это работает для всех путей, но не для самого корня. Я добавил дополнительный временный корневой путь к вершине route.rb, так что теперь он работает, как я хочу - спасибо! –  Nick 30.12.2011 в 17:14
  • Мой конечный результат выглядит следующим образом: «match» * foo '=> redirect (' / ') #NEWLINE root: to =>' content # holding '"В основном я взял вашу идею, добавил перенаправление, затем проложил root временно на мою страницу. –  Nick 30.12.2011 в 17:32
  • см. мои правки для получения root –  klochner 30.12.2011 в 17:38
  • , если вы перенаправляете, убедитесь, что это 302 (перемещается временно), а не 301 (перемещается навсегда) –  klochner 30.12.2011 в 17:45
1

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

Что я придумал, выглядит так:

# in routes.rb
get '*ignore_me' => 'site#unknown_url'

# in SiteController
def unknown_url
  redirect_to root_url
end

Не забудьте вставить запись маршрутов в самую нижнюю часть файла!

EDIT: Как заметил Ник, вы также можете сделать перенаправление непосредственно в файле маршрутов.

    
ответ дан cvshepherd 30.12.2011 в 17:16
источник
  • Да, я тоже это заметил. Вы также можете совершать переадресацию прямо на маршрутах.rb - см. Мой комментарий выше на ответ klochner –  Nick 30.12.2011 в 17:33
  • @ Ник Ах, теперь это замечательно. Перейдем к этому решению. –  cvshepherd 30.12.2011 в 17:42
0

Где в "routes.rb" находится ли эта строка?

Чтобы иметь приоритет над другими маршрутами, он должен быть помещен первым.

В качестве альтернативы вы можете посмотреть на это: Ссылка

Или это: Rails: режим обслуживания только для администратора

    
ответ дан Sergio Tulentsev 30.12.2011 в 15:28
источник
  • Упс - забыл упомянуть, что да, это было в верхней части файла. –  Nick 30.12.2011 в 15:35
  • Вы перезапустили сервер? :-) –  Sergio Tulentsev 30.12.2011 в 15:36
  • обновил ответ –  Sergio Tulentsev 30.12.2011 в 15:38
0

Я столкнулся с чем-то вроде этого, где у меня были имена доменов в качестве параметра в моем маршруте:

match '/:domain_name/', :to => 'sitedetails#index', :domain_name => /.*/, :as =>'sitedetails'

Ключ к этому был /.*/, который был подстановочным значком для почти всего. Так что, возможно, вы могли бы сделать что-то вроде:

match '/:path/', :to => 'content#holding', :path=> /.*/, :as =>'whatever_you_want'
    
ответ дан fregas 30.12.2011 в 17:05
источник