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

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

新闻列表的URL可能是

/dogs/snoopy-news/ 

并且可能有新闻报道

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

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

列出所有11月新闻报道

 /dogs/snoopy-news/2010/11/ 

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

 /dogs/snoopy-news/category/food/ 

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

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

编辑:这篇文章提供了一个可能的解决方案: 动态CMS像铁路上的ruby路线 ,我们将尝试并报告。 在CMS中保存页面时,我们不仅会在页面本身添加路由到路由表,还会为可能的参数添加路由:

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

您可以使用路径globbing和约束来匹配正确的模式。

 # 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和pass :path => "dogs/snoopy-news", :year => "2010", :month => "11" in params hash。 它将匹配所有具有一年和一个月的路由作为最后两个段,无论事先有多少段。 并且它将拒绝任何与最后两个段中的正确年份和月份不匹配的路线。 您对:path参数的操作由控制器决定。

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

你可以添加像这样的路线

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

这将路由该格式的任何URL

  ../snoopy-news/2010/23 

使用变量中设置的值到相应的控制器和操作

 年,日期 

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