1

我正在尝试使用以下行的 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/...”用于会话登录等)。

4

2 回答 2

2

如本问题所述:

rails 资源路由中的默认段名称

你应该可以使用这个插件:

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_pathuser_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.

于 2009-09-25T03:11:52.433 回答
0

在这个相关问题中查看我的答案

基本上,您可以:path => ''作为否定标识段的选项传递(仅在 Rails 3 中测试)请注意,这可能与其他路由模式发生冲突,因此请注意放置它的位置和方式。

于 2011-06-01T13:17:24.207 回答