我正在尝试创建一个带有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
这会产生以下网址:
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/...
”表示会话登录等。
答案 0 :(得分:1)
正如这个问题所述:
Default segment name in rails resources routing
你应该可以使用这个插件:
http://github.com/caring/default_routing
或者,您可以使用
等手动指定它们map.users '/users', :controller => 'users', :action => 'index',
:conditions => { :method => :get }
map.connect '/users', :controller => 'users', :action => 'create',
:conditions => { :method => :post }
map.user '/:id', :controller => 'users', :action => 'show',
:conditions => { :method => :get }
map.edit_user '/:id/edit', :controller => 'users', :action => 'edit',
:conditions => { :method => :get }
map.new_user '/users/new', :controller => 'users', :action => 'new',
:conditions => { :method => :get }
map.connect '/:id', :controller => 'users', :action => 'update',
:conditions => { :method => :put }
map.connect '/:id', :controller => 'users', :action => 'destroy',
:conditions => { :method => :delete }
map.resources :nodes, :path_prefix => '/:user_id', :name_prefix => 'user_'
# to generate user_nodes_path and user_node_path(@node) routes
这样或类似的东西应该从map.resources
为您提供您想要的东西。
map.resources不起作用,似乎命名路由不支持“:has_many”或“:belongs_to”选项。
命名路由支持has_many,用于向URL路径添加另一个资源级别。例如
map.resources :users, :has_many => :nodes
生成所有users_path
和user_nodes_path
路由,例如/users
,/users/:id
,/users/:id/nodes
和/users/:id/nodes/:id
。它与
map.resources :users do |user|
user.resources :nodes
end
注释掉“map.resources:users”并在它看起来有用之后解开“map.user”行...直到你到达嵌套资源。然后它吐出以下错误:
undefined method `user_nodes_path' for #<ActionView::Base:0x1052c8d18>
那是因为map.resources :users, :has_many => :nodes
生成了这些路线。 map.user '/:id', :controller => 'users', :action => 'show'
只生成一条命名路线,而user_path
。
答案 1 :(得分:0)
基本上,你可以通过:path => ''
作为选项来否定识别段(仅在Rails 3中测试)。请注意,这可能会与其他路由模式发生冲突,因此请注意放置它的位置和方式。