我们如何识别动态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会将此视为参数。
- Rails helper方法:嵌套哈希到嵌套HTML列表
- 在Rails + MySQL中存储一个百分比
- 如何解决Capybara :: ElementNotFound错误
- 有条件地使用haml中的content_for包装器
- 在PostsController中创建ActiveModel :: MassAssignmentSecurity :: Error
- rails db:migrate failed’ .users’不存在:显示来自`users`的完整字段
- 为什么rails预编译任务执行非摘要资产
- 创建新配方时,cocoon gem属性不会保存
- 如何validation提交ActiveRecord的单个属性而不是其所有属性?