我希望我的网址看起来像这样(类似于Flickr的设置方式)。
/photos/username
/videos/username
/blogs/username
/photos/username/12345
/videos/username/12345
/blogs/username/12345
有没有办法在路线文件中将它们设置为资源而不必做一堆自定义路线?
对于/photos/username/12345
网址...用户名不是必需的,但我认为网址更具可读性。
注意:我正在使用Rails 2.3.10
答案 0 :(得分:1)
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字母,数字和短划线。user_assets_path(:photos,'edgerunner')
以呈现/photos/edgerunner
id
)数字,因此与/photos/clouds/nimbus
不匹配