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

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

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

match '*' => 'content#holding'

и

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

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

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

/EDIT/ Забыл упомянуть, что это правило было в самом верху моего файла route.rb.


person Nick    schedule 30.12.2011    source источник
comment
Вы поместили этот маршрут в самый верх вашего файла маршрутов?   -  person Robin    schedule 30.12.2011


Ответы (4)


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

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

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

match '(*foo)' => 'content#holding'
person klochner    schedule 30.12.2011
comment
Кажется, это работает для всех путей, но не для самого корня. Я также добавил дополнительный временный корневой маршрут вверху route.rb, так что теперь он работает так, как я хочу - спасибо! - person Nick; 30.12.2011
comment
Мой конечный результат выглядит следующим образом: match '*foo' =› redirect('/') #NEWLINE root :to =› 'content#holding' По сути, я воспользовался вашей идеей, добавил перенаправление, а затем временно перенаправил root на мою удерживающую страницу. . - person Nick; 30.12.2011
comment
если вы перенаправляете, убедитесь, что это 302 (перемещено временно), а не 301 (перемещено навсегда) - person klochner; 30.12.2011
comment
Это работает как шарм. А не поделитесь, в каком месте официального документа указаны эти сведения? - person hiveer; 28.12.2018
comment
Я бы предложил использовать all как более описательное имя переменной. - person Lerk; 22.10.2020

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

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

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

# in SiteController
def unknown_url
  redirect_to root_url
end

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

РЕДАКТИРОВАТЬ: Как указал Ник, вы также можете выполнить перенаправление непосредственно в файле маршрутов.

person cvshepherd    schedule 30.12.2011
comment
Да - я тоже это заметил. Вы также можете делать перенаправления прямо в route.rb - см. мой комментарий выше к ответу клохнера. - person Nick; 30.12.2011
comment
@Ник А, вот это здорово. Переключится на это решение. - person cvshepherd; 30.12.2011

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

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

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

match '/:path/', :to => 'content#holding', :path=> /.*/, :as =>'whatever_you_want'
person fregas    schedule 30.12.2011

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

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

В качестве альтернативы вы можете посмотреть это: http://onehub.com/blog/posts/rails-maintenance-pages-done-right/

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

person Sergio Tulentsev    schedule 30.12.2011
comment
Ой, забыл упомянуть, что да, это было в начале файла. - person Nick; 30.12.2011
comment
Вы перезапустили сервер? :-) - person Sergio Tulentsev; 30.12.2011