簡體   English   中英

Rails無法匹配現有路由

[英]Rails can't match the existed route

首先,我耙路線檢查所有路線,並確保它存在於我的應用程序中。

在我的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) %>

為方便起見,我不會在這里粘貼所有代碼。

但如果你明白我的意思,你知道,告訴我為什么會這樣。

如果您想要更多細節,請添加評論。

我認為問題在於您將地址路由定義為用戶的嵌套路由。 具體來說,在rails文檔中指出:

傳遞記錄(如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"}

請注意,第二個選項(復數)為您提供了能夠為每個用戶尋址多個地址的路由,而單數路由只為您提供一個地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM