我们正在构建一个Rails CMS,其中博客或新闻列表可以出现在站点树中的任何地方。这意味着任何页面都可以根据数据库字段知道它们的类型-例如:一个页面知道它的类型是newslisting,所以一旦该页面的URL被调用,我们就需要它被newslistingcontroller处理。新闻页面的子页是新闻故事-每个都有日期和类别。
指向newslisting的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对应的页面)
编辑:这篇文章给出了一个可能的解决方案:Dynamic CMS like routes in ruby on rails,我们将尝试并返回报告。在CMS中保存页面时,我们将在该点将路由添加到路由表中,不仅针对页面本身,还针对可能的参数:
/dogs/snoopy-news/{year}/{month}/发布于 2011-01-16 19:52:07
您可以使用路由全局匹配和约束来匹配适当的模式。
# 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"。它将匹配最后两个网段为一年和一个月的所有路由,而不管之前有多少网段。它将拒绝最后两个网段中与正确的年份和月份不匹配的任何路由。如何处理:path参数取决于您在控制器中的操作。
https://stackoverflow.com/questions/4690298
复制相似问题