Rails:如何设置模仿Flickr的URL架构的路由

时间:2010-11-19 18:38:45

标签: ruby-on-rails routes

我希望我的网址看起来像这样(类似于Flickr的设置方式)。

/photos/username
/videos/username
/blogs/username
/photos/username/12345
/videos/username/12345
/blogs/username/12345

有没有办法在路线文件中将它们设置为资源而不必做一堆自定义路线?

对于/photos/username/12345网址...用户名不是必需的,但我认为网址更具可读性。

注意:我正在使用Rails 2.3.10

1 个答案:

答案 0 :(得分:1)

只需制作一些常规的非RESTful路线

map.connect ":controller/:username", :action => :index
map.connect ":controller/:username/:id", :action => :show

这会将/photos/shpigford路由到index上的PhotosController操作,并将:username => "shpigford"放入params哈希。第二行会将id的网址(例如/videos/edgerunner/35467)发送到show上的VideosController操作,并将:username => "edgerunner", :id => "35467"放入params哈希

您可能希望稍微约束这些路线,以便它们不会意外地匹配其他类似路线。您可能还想添加命名路由。更精细的设置将是:

map.with_options :controller => /photos|videos|blogs/, 
                 :username => /[-a-z0-9]+/,
                 :conditions => { :method => :get } do |route|
  route.user_assets ":controller/:username",     :action => :index
  route.user_asset  ":controller/:username/:id", :action => :show, :id => /\d+/
end

with_options块将其选项应用于其中的所有路径定义,因此我们不必每次都重复它们。这样做,除了上面的基本设置之外,还有;

  • 确保第一个段是我们拥有的三个控制器之一(否则它会很乐意接受/zombies/fandango并尝试执行不存在的ZombiesController的索引操作以使其失败)
  • 确保第二段(username)仅包含小写ASCII字母,数字和短划线。
  • 仅接受HTTP GET请求。 POST,PUT和DELETE不受欢迎。
  • 将这些路线定义为命名路线,以便您可以在视图中致电user_assets_path(:photos,'edgerunner')以呈现/photos/edgerunner
  • 仅确定第三段(id)数字,因此与/photos/clouds/nimbus不匹配