我正在尝试使用以下行的 url 方案创建嵌套资源:“ http://example.com/username/...
”。
我目前拥有的是这样的:
ActionController::Routing::Routes.draw do |map|
map.home '/', :controller => 'home'
map.resource :session
map.resources :users, :has_many => :nodes
#map.user '/:id', :controller => 'users', :action => 'show', :has_many => :nodes
map.resources :nodes, :belongs_to => :user
end
这会产生如下 URL:
http://example.local/users/username
http://example.local/users/username/nodes
如何避免“用户”前缀超出了我的范围。将“ as: => ''
”选项传递给map.resources
不起作用,似乎命名路由不支持“ :has_many
”或“ :belongs_to
”选项。
注释掉“ map.resources :users
”并取消注释“ map.user
”行之后它似乎工作......直到你到达一个嵌套资源。然后它吐出以下错误:
undefined method `user_nodes_path' for #<ActionView::Base:0x1052c8d18>
我知道这个问题之前已经出现过很多次,并且总是遇到“你为什么要这样做?” 回应。坦率地说,Twitter 做到了,Facebook 做到了,我也想这样做!;-D
至于如何避免用户名与内置路径冲突的常见批评,我已将我的最小用户名长度设置为 6 个字符,并计划使所有内置根级路径分段路径为 5 个字符或更短(即“ /opt/...
”用于选项,“ /in/...
”用于会话登录等)。