Как мы определяем параметры в динамическом URL? - PullRequest
1 голос
/ 14 января 2011

Мы создаем CMS Rails, где блог или список новостей могут появляться в любом месте дерева сайта. Это означает, что любая страница знает свой тип на основе поля базы данных - например: страница знает, что она относится к списку новостей типа, поэтому, когда этот 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 ]

2 голосов
/ 16 января 2011

Вы можете использовать маршрутизацию и ограничения, чтобы соответствовать правильному шаблону.

# 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, зависит от вас в контроллере.

1 голос
/ 14 января 2011

Вы можете настроить эту проблему в вашем файле rout.rb.

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

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

, который направит любой URL-адрес формата

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

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

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