WedX - журнал о программировании и компьютерных науках

Статическая маршрутизация страниц Rails — есть ли лучший способ?

Для ясности, вот ситуация:

Я создаю очень простую CMS, которая станет основой для нескольких приложений, которые я планирую создать в будущем. Мне бы очень хотелось иметь возможность создать страницу под названием «О программе» (которая будет в основном статической) и автоматически иметь доступ к ней в «/ about» без необходимости изменять route.rb.

В настоящее время у меня есть такой маршрут с подстановочными знаками, который отлично работает:

match '/*slug', :to => 'pages#dynamic_page', 
                :constraints => { :fullpath => /.+\.html/ }

Проблема в том, что я действительно хотел бы опустить «.html» в конце. Тем не менее, я предпочитаю расширение URL-адресу типа «/pages/about». Есть ли лучший способ справиться с этим? Проблема, которая возникает, когда я удаляю ограничение, заключается в том, что запросы к несуществующим элементам проходят через маршрутизатор Rails, что, очевидно, нежелательно, поскольку это дополнительные накладные расходы, которые необходимо обрабатывать.

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

Спасибо!


Ответы:


1

Чтобы решить эту проблему в маршрутизаторе Rails, вы должны иметь возможность просто добавить маршрут в самый конец route.rb, который выглядит примерно так:

match '/:slug(.:format)', :to => 'pages#dynamic_page'

Круглые скобки отмечают параметр :format маршрута как необязательный, поэтому /about или /about.html должны работать.

Это должно быть внизу файла маршрутов, чтобы он не мешал другим вашим маршрутам.

Если вы хотите избежать маршрутизатора Rails, у вас есть два варианта, оба немного более продвинутые.

  1. В конфигурации вашего веб-сервера добавьте правило перезаписи, которое сопоставляет /about с каким-либо другим URI.

  2. Добавьте промежуточное ПО Rack или металл Rails для обработки маршрутов статических страниц. Это позволяет избежать выполнения этих запросов через весь стек маршрутизации Rails, но маршрутизатор Rails 3 довольно быстр, и я не уверен, что стоит добавлять столько сложностей только для обслуживания полустатической страницы.

Вы также можете заглянуть в жемчужину High Voltage. Это движок Rails для обслуживания в основном статических страниц. По умолчанию он дает вам URL-адрес стиля /pages/about, но вы можете добавить следующее к своим маршрутам, чтобы сделать его красивее:

# High Voltage treats pages like a REST resource; the page's name is the ID 
match '/:id(.:format)', :to => 'high_voltage/pages#show'
04.11.2010
  • Спасибо, однако проблема с необязательным форматом заключается в том, что браузеры затем начинают делать запросы к /favicon.ico, и эти запросы проходят через метод dynamic_page в моем PagesController. Первое, что происходит в указанном методе, — это попадание в базу данных, чтобы увидеть, есть ли какие-либо совпадающие страницы с URL-слагом «favicon» или «favicon.ico» — мне бы очень хотелось избежать попаданий в базу данных. Вот почему у меня сейчас есть ограничение .html. 05.11.2010
  • У вас есть статический файл favicon.ico? К сожалению, браузеры будут просить об этом, и я предпочитаю не создавать безумно сложное решение только для того, чтобы обойти это, поэтому я просто помещаю пустой файл favicon в свой общедоступный каталог и считаю, что это сделано. Вы даже можете просто сделать его пустым текстовым файлом — браузер задохнется от него, но он также задохнется от ошибки 500 из вашего приложения, и таким образом не будет попадания в БД. 05.11.2010
  • Я не знаю, но думаю, что могу, если нужно. Меня больше всего беспокоит то, что каждый раз, когда возникает ошибка 404 или ошибка маршрутизации, он будет проходить по этому маршруту без необходимости. 05.11.2010
  • Это будет происходить, но это не так уж важно. Если ваша запись в базе данных динамической страницы не найдена, Rails все равно должен обработать это как ошибку 404 (это код ошибки по умолчанию для ActiveRecord::RecordNotFound). 05.11.2010
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]