【问题标题】:Rails: How to setup routes that mimic Flickr's URL schemaRails:如何设置模仿 Flickr 的 URL 模式的路由
【发布时间】:2010-11-20 06:11:23
【问题描述】:

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

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

有没有办法将它们设置为我的路由文件中的资源,而不必执行一堆自定义路由?

/photos/username/12345 URL 的情况下...用户名不是必需的,但我认为使 URL 更具可读性。

注意:我使用的是 Rails 2.3.10

【问题讨论】:

  • 有必要这样解决吗?拥有 /username/photos 会更容易。
  • 您几乎必须设置一堆自定义路线,因为您所做的不是“rails 方式”。只有当你遵循约定时,才会出现 Rails 提供的漂亮的小快捷方式:p

标签: ruby-on-rails routes


【解决方案1】:

只做一些常规的非 RESTful 路由

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

这会将/photos/shpigford 路由到PhotosController 上的index 操作,并将:username => "shpigford" 放入params 哈希中。第二行会将带有id 的URL(如/videos/edgerunner/35467)路由到VideosController 上的show 操作,并将: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 不匹配

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 2021-06-12
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    相关资源
    最近更新 更多