2010-09-18 46 views
1

我將Rails 3.0.0.beta4中的一個應用程序升級到了Rails 3.0.0,並遇到意外錯誤。我使用authlogic進行身份驗證,升級後,新用戶會話表單的路由開始拋出此錯誤。有關Authlogic和Rails 3.0.0的路徑問題

未定義的方法`user_sessions_path」

好吧,我使用的是單一控制器名稱。不確定beta4和導致問題的新版本之間有什麼不同。

在我的routes.rb文件,我有這樣的:

get "user_session/new",  :as => :login 
    get "user_session/destroy", :as => :logout 
    resources :user_session, :controller => :user_session 

其中定義我的奇異控制器的路線。

要解決我不得不改變形式,從這個第一行的問題:

<%= form_for @user_session do |f| %> 

這樣:

<%= form_for @user_session, :url => user_session_index_path do |f| %> 

令人震驚的我,奇怪的是路由的名稱。運行耙路線顯示路線的名稱,但我不明白爲什麼需要索引。我期待更像post_ method的user_session_path。我的user_session路線是唯一以這種方式行事的路線。所有其他都如我所料。

繼承人從耙路輸出:

user_session_index GET /user_session(.:format)        {:action=>"index", :controller=>"user_session"} 
user_session_index POST /user_session(.:format)        {:action=>"create", :controller=>"user_session"} 

這工作,但我很好奇,想知道是否有人遇到了這一點。

回答

1

首先,我不明白,爲什麼在指定控制器名稱時,它的名稱與資源名稱相同?這兩個,是等效的:

resources :user_session, :controller => :user_session 
resources :user_session 

AFAIR通過設計創建只是做POST到相同的路徑作爲索引。根據定義,當控制器名稱是單數時,路由器將無法創建複數形式的名稱。它反過來工作。因此,索引中的_index後綴和創建操作。

奇異的名字建議,該資源是奇異的,所以你應該只使用(奇異的資源):

resource :user_session 

在這種情況下將不會有索引操作(因爲它沒有SENCE對於單數資源),創建路徑的名稱將爲user_session_path。

作爲一個方面說明,單數資源並不意味着,只有一個模型實例。它只是指定你如何訪問資源。例如,您可以讓多個用戶使用配置文件,但使用單一資源管理配置文件是完全有道理的,因爲每個用戶只能訪問他自己的配置文件。

ps。在Rails 3之前,我轉向Devise進行身份驗證,並且我不記得Authlogic中如何解決路由問題。

+0

謝謝。我在測試解決此錯誤時添加了複數資源:「ActionController :: RoutingError(未初始化的常量UserSessionsController)」,並忘記將其刪除。這解釋了路徑中的索引。我仍然創建了這樣的路線:resource:user_session,:controller =>:user_session來解決上述錯誤。我還需要爲form_for提供:url選項,因爲它確實需要複數資源。 – 2010-09-20 23:37:57

+0

我不知道有一個資源(vs資源),多數民衆贊成真棒 - 謝謝! – Chance 2011-05-12 18:42:59