How do we identify parameters in a dynamic URL?
We are building a Rails CMS where a blog or news listing can appear anywhere in the site tree. This means that any page knows their type based on a database field - eg: a page knows that it is of type newslisting so once that URL is called for that page we need it to be processed by the newslistingcontroller. The subpages of the newslisting page are news stories - each with a date and category.
The URL to the newslisting might be
/dogs/snoopy-news/
and a news story might be
/dogs/snoopy-news/snoopy-is-great/
The complexity for us is with URLs that have additional parameters in for listing date ranges of news stories or category listings eg:
Listing all november news stories
/dogs/snoopy-news/2010/11/
Or listing all stories which have food as their category:
/dogs/snoopy-news/category/food/
Since that newslisting page could be at any level in the site hierarchy how would we approach identifying that 2010 is a parameter or that category is a parameter?
(We will store all URLs in the database for each page so we can lookup first to see if a page exists for a URL)
EDIT: This post gives a possible solution: Dynamic CMS like routes in ruby on rails which we will try out and report back on. On save of a page in the CMS we would add routes to the routing table at that point for not only the page itself but for also possib开发者_运维问答le parameters:
/dogs/snoopy-news/{year}/{month}/
You can use route globbing and constraints to match a proper pattern.
# 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]/ }
This will match /dogs/snoopy-news/2010/11
and pass :path => "dogs/snoopy-news", :year => "2010", :month => "11"
in the params hash. It will match all routes that have a year and a month as the last two segments, regardless of how many segments come beforehand. And it will reject any route that doesn't match a proper year and month in the last two segments. What you do with the :path
parameter is up to you in the controller.
You can configure this issue in your routes.rb file.
you can add a route like
map.connect 'snoopy-news/:year/:date', :controller => 'needed controller', :action => 'needed action'
this will route any URL of the format
../snoopy-news/2010/23to the corresponding controller and action with the values set in the varialbles
year , date
If you dont give anything, RAILS will consider this as a parameter.
精彩评论