1

我正在尝试获得一个基本的嵌套资源路径来工作,但目前出现以下错误:

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 网站上阅读的所有内容都表明这应该有效。有谁知道我哪里出错了?

4

2 回答 2

3
resources :users do
  resources :stores
end

创建store所有需要给定的路由,user因为它是嵌套的。

所以 eg<%= 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. 所以需要传入store id或者store对象来生成path/url。例如<%= link_to 'Store', user_store_path(current_user, current_user.store.first %>。我在最初的回答中错过了这一点,对不起。

于 2012-06-01T08:48:46.403 回答
2

仅指定路径是不够的,您还必须指定对象或其 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 routes,你会看到在一些你想指定 id 的路径中,例如:/users/:user_id/stores/:id

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

于 2012-06-01T08:51:20.520 回答