我们如何识别动态URL中的参数?

时间:2011-01-14 10:57:59

标签: ruby-on-rails routing

我们正在构建一个Rails CMS,其中博客或新闻列表可以出现在站点树的任何位置。这意味着任何页面都基于数据库字段知道它们的类型 - 例如:页面知道它是新闻列表类型,因此一旦为该页面调用该URL,我们需要它由newslistingcontroller处理。新闻列表页面的子页面是新闻故事 - 每个都有日期和类别。

新闻列表的网址可能是

/dogs/snoopy-news/ 

和新闻报道可能是

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

我们的复杂性在于其中包含用于列出新闻报道或类别列表的日期范围的其他参数的网址,例如:

列出所有11月新闻报道

/dogs/snoopy-news/2010/11/

或列出所有以食物为类别的故事:

/dogs/snoopy-news/category/food/

由于新闻列表页面可能位于网站层次结构中的任何级别,我们如何确定2010是参数还是该类别是参数?

(我们将为每个页面存储数据库中的所有URL,以便我们可以先查找是否存在URL的页面)

编辑:这篇文章给出了一个可能的解决方案:Dynamic CMS like routes in ruby on rails我们将尝试并报告。在CMS中保存页面时,我们不仅会在页面本身添加路由到路由表,还会为可能的参数添加路由:

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

2 个答案:

答案 0 :(得分: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并在params哈希中传递:path => "dogs/snoopy-news", :year => "2010", :month => "11"。它将匹配所有具有一年和一个月的路由作为最后两个段,无论事先有多少段。并且它将拒绝任何与最后两个段中的正确年份和月份不匹配的路线。使用:path参数执行的操作由控制器决定。

答案 1 :(得分:1)

您可以在routes.rb文件中配置此问题。

您可以添加

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

等路线

这会将格式

 ../snoopy-news/2010/23 
的任何网址路由到相应的控制器和操作,并使用在变量
 year , date 

中设置的值

如果你不提供任何东西,RAILS会将此视为参数。