Rails无法匹配现有路由

时间:2011-10-01 02:16:25

标签: ruby-on-rails routes ruby-on-rails-3.1

首先我搜索路线以检查所有路线,并确保它存在于我的应用程序中。

在我的route.rb

resources :user do
  resource :account
  resource :addresses
end

到目前为止一切都很好。我有一些路径助手方法。如

user_addresses_path

这个帮助方法在任何地方都可以正常工作(我的意思是它适用于每个视图模板),除了一个地方。它无法在我的用户的视图模板下工作。我会告诉你。

#it works here.
#this file is under app/view/address
<%= user_addresses_path(@user) %>    

#it doesn't work here.
#this file is under app/view/user
<%= user_addresses_path(@user) %>

为方便起见,我不会在此处粘贴所有代码。

但如果你明白我的意思,你知道,告诉我为什么会这样。

如果您想了解更多细节,请添加评论。

1 个答案:

答案 0 :(得分:2)

我认为问题在于您将地址路由定义为用户的嵌套路由。具体来说,在rails documentation中声明:

  

传递记录(如Active Record或Active Resource)而不是Hash作为options参数将触发该记录的命名路由。查找将在类的名称上进行。因此,传递Workshop对象将尝试使用workshop_path路由。如果你有一个嵌套的路由,比如admin_workshop_path你必须明确地调用它(url_for不可能猜出那条路线)。

换句话说,因为被引用的路由被定义为嵌套路由,所以rails无法猜测路由。由于地址嵌套在用户内部,因此可以在特定地址时猜测用户,但在用户级别时可以猜测地址。

此外,您所拥有的是“一对多”用户与地址的关系吗?如果是这种情况,那么您的resource可能需要在您的路线文件中为resources(复数)。

resources :user do
  resource :addresses
end

给你:

user_addresses         POST   /user/:user_id/addresses(.:format)        {:action=>"create", :controller=>"addresses"}
new_user_addresses     GET    /user/:user_id/addresses/new(.:format)    {:action=>"new", :controller=>"addresses"}
edit_user_addresses    GET    /user/:user_id/addresses/edit(.:format)   {:action=>"edit", :controller=>"addresses"}
                       GET    /user/:user_id/addresses(.:format)        {:action=>"show", :controller=>"addresses"}
                       PUT    /user/:user_id/addresses(.:format)        {:action=>"update", :controller=>"addresses"}
                       DELETE /user/:user_id/addresses(.:format)        {:action=>"destroy", :controller=>"addresses"}

但是,

resources :user do
  resources :addresses
end

给你:

                    POST   /user/:user_id/addresses(.:format)          {:action=>"create", :controller=>"addresses"}
new_user_address    GET    /user/:user_id/addresses/new(.:format)      {:action=>"new", :controller=>"addresses"}
edit_user_address   GET    /user/:user_id/addresses/:id/edit(.:format) {:action=>"edit", :controller=>"addresses"}
user_address        GET    /user/:user_id/addresses/:id(.:format)      {:action=>"show", :controller=>"addresses"}
                    PUT    /user/:user_id/addresses/:id(.:format)      {:action=>"update", :controller=>"addresses"}
                    DELETE /user/:user_id/addresses/:id(.:format)      {:action=>"destroy", :controller=>"addresses"}

请注意,第二个选项(复数)为您提供了能够为每个用户寻址多个地址的路由,而单数路由只为您提供一个地址。