Rails 3 – 嵌套资源路由

在我的应用程序中,我有用户,然后每个用户都有一个邮箱,他们在那里发送邮件。 我的routes.rb看起来像:

resources :users do resources :mailboxes end 

如果我做一个rake路线,我看到这条路线可供我使用:

 user_mailbox GET /users/:user_id/mailboxes/:id(.:format) {:action=>"show", :controller=>"mailboxes"} 

我想在我的应用程序布局中链接到此路径,在用户在屏幕顶部找到的工具栏中。

我的观看代码是:

  'mail_notice'), user_mailbox_path(current_user)%> 

我遇到的问题是,如果我对用户/ *没有任何帮助,我会收到此路径的路由错误 – 所以我的应用程序中的任何其他位置除了我的邮箱嵌套在其下的资源之外。 如果我在,让我说用户的索引页面,路径确实可以正常工作。

 No route matches {:action=>"show", :controller=>"mailboxes", 

这条路线有什么我可以错过的吗? 任何与用户相关的东西都有效,它只是我遇到问题的邮箱。

谢谢

听起来邮箱应该是一个单一的资源。

 resources :users do resource :mailbox end 

否则,它会期望用户有多个邮箱,并且您还必须将mailbox_id提供给user_mailbox_path

 user_mailbox_path(current_user, @mailbox) 

正如您从路线中看到的那样:

 user_mailbox GET /users/:user_id/mailboxes/:id(.:format) 

你需要提供两个id,即:user_id和邮箱的id。 如果用户可以拥有多个邮箱,这是有意义的。

 <%= link_to image_tag("mail_icon.png", :id => 'mail_notice'), user_mailbox_path(current_user, current_user.mailboxes.first) %> 

如果您打算让用户只有一个邮箱,那么我会改变routes.rb,如下所示:

 resources :users do get :mailbox, :on => :member end 

你会得到一条路线:

 mailbox_user GET /users/:id/mailbox(.:format) 

这将由UsersController上的mailbox方法处理,您可以使用mailbox_user_path(current_user)在视图中获取它的路径。