首先我搜索路线以检查所有路线,并确保它存在于我的应用程序中。
在我的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) %>
为方便起见,我不会在此处粘贴所有代码。
但如果你明白我的意思,你知道,告诉我为什么会这样。
如果您想了解更多细节,请添加评论。
答案 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"}
请注意,第二个选项(复数)为您提供了能够为每个用户寻址多个地址的路由,而单数路由只为您提供一个地址。