2009-09-25 177 views
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 

這導致網址,如:

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/...」用於會話登錄等)。

回答

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 doesn't work and it seems named routes don't support the ":has_many" or ":belongs_to" options.

命名路由支持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 

Commenting out the "map.resources :users" and uncommmenting the "map.user" line after it seems to work… until you reach a nested resource. Then it spits out the following error:

undefined method `user_nodes_path' for #<ActionView::Base:0x1052c8d18> 

這是因爲map.resources :users, :has_many => :nodes產生這些路由。 map.user '/:id', :controller => 'users', :action => 'show'只生成一條命名路由,即user_path

+0

太棒了!我很驚訝我之前沒有找到default_routing插件;它看起來像任何項目必須具備的!謝謝你的幫助! – 2009-09-25 06:06:31

+3

我應該提到,雖然default_routing插件非常棒,但它在Rails 2.3.4(以及可能更早的版本)中也非常糟糕。 然而,在http://github.com/slippyd/default_routing有一個固定的版本。 – 2009-09-26 08:46:37

+0

感謝您的鏈接,Slippy,您的版本爲我完美工作! – 2009-10-01 22:12:16

0

見我在this related question

基本上回答,您可以通過:path => ''作爲一個選項否定識別段(在Rails 3中只測試)要知道,這可能與其他的路由模式發生衝突,所以要小心,在以及你如何放置它。

+0

這確實看起來像Rails 3.x已經消除的問題(和修復)。當我更新從Rails 2.3.x到3.x需要的應用程序時,我必須檢查你的解決方案。 – 2011-07-11 16:11:51