我正在尝试使用基本的嵌套资源路径,但目前收到以下错误:
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网站上看到的一切都表明这应该有效。有没有人有任何想法我错了?
答案 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