嵌套资源没有路由匹配错误

时间:2012-06-01 08:02:23

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 nested-resources

我正在尝试使用基本的嵌套资源路径,但目前收到以下错误:

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

在我看来,我有以下链接:

 <% if current_user %> Hello <%= current_user.email %> /
  <%= link_to 'Store', user_store_path %> 
    <%= link_to 'New Store', new_user_store_path %>
    <%= link_to 'My Profile', home_path %>
    <%= link_to 'Edit Profile', update_path %>
    <%= link_to "Logout", logout_path %> 
   <% else %>
   <%= link_to "Login", login_path %> / <%= link_to "Sign up", signup_path %>
  <% end %>

现在当我调整我的路线时,我所获得的路径与上面的路径完全匹配 - user_store_path等。

我的路线文件如下所示:

   resources :users do
     resources :stores
   end

   match "signup" => "users#new"
   match "home" => "users#show"
   match "update" => "users#edit"

   get "login" => "sessions#new"
   post "login" => "sessions#create"
   delete "logout" => "sessions#destroy"
   get "logout" => "sessions#destroy"

   resources :sessions

   root :to => 'sessions#new'

这让我很困惑,因为我在RoR网站上看到的一切都表明这应该有效。有没有人有任何想法我错了?

2 个答案:

答案 0 :(得分:3)

resources :users do
  resources :stores
end

创建store个路由,这些路由都需要给定的user,因为它是嵌套的。

所以,例如<%= link_to 'Store', user_store_path %>错误,因为它没有提供任何用户。它应该是<%= link_to 'Store', user_store_path(current_user, store) %>

这也适用于您的其他链接,例如<%= link_to 'New Store', new_user_store_path %>应为<%= link_to 'New Store', new_user_store_path(current_user) %>

根据您的评论进行更新

发生

No route matches {:action=>"show", :controller=>"stores" [...]是因为您希望show某个特定资源,在此示例中为store。因此,您需要传入商店标识或商店对象以生成路径/网址。例如。 <%= link_to 'Store', user_store_path(current_user, current_user.store.first %>。我在最初的回答中错过了,抱歉。

答案 1 :(得分:1)

仅指定路径是不够的,还必须指定对象或其ID。 例如:

<%= link_to 'Store', [current_user, store] %>
<%= link_to 'Store', user_store_path(user_id: current_user.id, id: store.id) %>
<%= link_to 'New Store', new_user_store_path(user_id: current_user.id) %>
#and so on

运行rake路线,您会在某些路径中看到要指定ID,例如:/users/:user_id/stores/:id

http://guides.rubyonrails.org/routing.html#creating-paths-and-urls-from-objects