сохранение маршрута будет на дорогой стороне

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

URL к списку новостей может быть

/dogs/snoopy-news/ 

и новость может быть

/dogs/snoopy-news/snoopy-is-great/

Сложность для нас заключается в URL-адресах, которые имеют дополнительные параметры для перечисления диапазонов дат новостей или списков категорий, например:

Перечисление всех новостей за ноябрь

/dogs/snoopy-news/2010/11/

Или перечисление всех историй, которые имеют еду в своей категории:

/dogs/snoopy-news/category/food/

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

(Мы будем хранить все URL-адреса в базе данных для каждой страницы, чтобы мы могли сначала посмотреть, существует ли страница для URL-адреса)

РЕДАКТИРОВАТЬ: Этот пост дает возможное решение:Динамические CMS как маршруты в ruby ​​на рельсах который мы опробуем и доложим. При сохранении страницы в CMS мы добавили бы маршруты в таблицу маршрутизации в этой точке не только для самой страницы, но и для возможных параметров:

/dogs/snoopy-news/{year}/{month}/

Ответы на вопрос(2)

Решение Вопроса

чтобы соответствовать правильному шаблону.

# Rails 2.x
map.connect "*path/:year/:month", 
             :constraints => {:year => /\d{4}/, :month => /0[1-9]|1[0-2]/ },
             :controller => :pages, :action => :month_archive

# Rails 3.x
match "*path/:year/:month" => "pages#month_archive", 
             :constraints => {:year => /\d{4}/, :month => /0[1-9]|1[0-2]/ }

Это будет соответствовать/dogs/snoopy-news/2010/11 и передать:path => "dogs/snoopy-news", :year => "2010", :month => "11" в хэше params. Он будет соответствовать всем маршрутам, которые имеют год и месяц в качестве двух последних сегментов, независимо от того, сколько сегментов было заранее. И он отклонит любой маршрут, который не соответствует надлежащему году и месяцу в последних двух сегментах. Что вы делаете с:path Параметр зависит от вас в контроллере.

 petenelson17 янв. 2011 г., 18:17
Большое спасибо, это выглядит многообещающе - мы попробуем это

Вы можете добавить маршрут как

 map.connect 'snoopy-news/:year/:date', :controller => 'needed controller', :action => 'needed action' 

это направит любой URL формата

 ../snoopy-news/2010/23 
соответствующему контроллеру и действию со значениями, установленными в переменных
 year , date 

Если вы ничего не дадите, RAILS будет рассматривать это как параметр.

 CHID14 янв. 2011 г., 18:20
сохранение маршрута будет на дорогой стороне
 CHID14 янв. 2011 г., 18:18
Может быть, вы можете получить URLdynamic url в действии по умолчанию. Получить параметры и использовать сравнение для динамического расчета URL поможет? Я не совсем уверен с этой идеей. Поскольку вы говорите, что страница полностью динамическая, мы не можем создать статический маршрут.
 14 янв. 2011 г., 16:53
Спасибо за ответ, но это не сработает, потому что / snoopy-news / является динамической страницей на сайте и может отображаться на любом уровне иерархии. Если пользователь редактирует эту страницу в cms и вызывает ее / snoopy-special-news /, это не будет работать. Единственное возможное решение, которое я могу придумать (и не знаю, как реализовать), - когда эта страница сохраняется, динамически сохраняйте маршрут для достижения этой цели. Будет ли это работать или это лучший, более простой подход?

Ваш ответ на вопрос