2010-10-14 78 views
4

我一直在將Rails 2.3.9應用程序轉換爲Rails 3.0,並且一切都進行得很順利。我用新系統創建了很多路線,所以我覺得我知道如何做到這一點。但是,最近我得到了一個我無法解決的路由錯誤。Rails 3.0中奇怪的路由錯誤

我有一個用戶的資源是這樣定義的:

resources :users do 
    member do 
    get 'activate' 
    get 'edit_password' 
    post 'update_password' 
    end 

    collection do 
    get 'forgot_password' 
    post 'send_reset_instructions' 
    end 
end 

的失敗路線update_password。如果我將其更改爲get方法,則可以使用。但是,當用作帖子時,數據來自「edit_password」中的表單。

這是錯誤消息:

Routing Error 

No route matches "https://stackoverflow.com/users/31/update_password" 

這是耙路由的(相關的)輸出:

   activate_user GET /users/:id/activate(.:format)        {:action=>"activate", :controller=>"users"} 
      edit_password_user GET /users/:id/edit_password(.:format)       {:action=>"edit_password", :controller=>"users"} 
     update_password_user POST /users/:id/update_password(.:format)      {:action=>"update_password", :controller=>"users"} 
     forgot_password_users GET /users/forgot_password(.:format)       {:action=>"forgot_password", :controller=>"users"} 
send_reset_instructions_users POST /users/send_reset_instructions(.:format)     {:action=>"send_reset_instructions", :controller=>"users"} 
         users GET /users(.:format)           {:action=>"index", :controller=>"users"} 
         users POST /users(.:format)           {:action=>"create", :controller=>"users"} 
        new_user GET /users/new(.:format)          {:action=>"new", :controller=>"users"} 
        edit_user GET /users/:id/edit(.:format)         {:action=>"edit", :controller=>"users"} 
         user GET /users/:id(.:format)          {:action=>"show", :controller=>"users"} 
         user PUT /users/:id(.:format)          {:action=>"update", :controller=>"users"} 
         user DELETE /users/:id(.:format)          {:action=>"destroy", :controller=>"users"} 

最後,這是web服務器的該請求的輸出(webrick):

Started POST "https://stackoverflow.com/users/31/update_password" for 127.0.0.1 at 2010-10-14 23:30:59 +0200 
    SQL (1.5ms) SELECT name 
FROM sqlite_master 
WHERE type = 'table' AND NOT name = 'sqlite_sequence' 
    SQL (0.7ms) SELECT name 
FROM sqlite_master 
WHERE type = 'table' AND NOT name = 'sqlite_sequence' 


ActionController::RoutingError (No route matches "https://stackoverflow.com/users/31/update_password"): 


Rendered /home/jonatan/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.0ms) 

你能找到任何邏輯我嗎這個?

我正在使用通過gem(3.0.1)提供的最新Rails。起初,我在用戶模型中重寫了* to_param *來使用用戶名,但是無論如何,問題都是一樣的。

我檢查了模型的update_password方法中的拼寫錯誤,並且確保它不是私有的。

+0

如果將其從update_password更改爲foo(以及您的控制器方法以及視圖名稱),會發生什麼情況? – Maxem 2010-10-14 21:47:34

+0

我試圖將其更改爲「updatera_password」(幾乎瑞典語;)),但這也沒有幫助。我想也許update_password是某種類型的som關鍵字,但顯然並非如此。 – Jonatan 2010-10-14 22:57:13

回答

2

我已經注意到這個問題,以及,只用POST方法,只使用「成員」,所以同你的榜樣,即當:

resources :forum_posts do 
    member do 
    post :preview 
    end 
end 

將觸發此,但改變它來獲得或使用收集既工作正常,所以似乎是軌道路線的錯誤;我現在通過在我的資源上面添加以下內容來解決這個問題:forum_posts do line:

match '/forum_posts/:id/preview(.:format)', :to => "forum_posts#preview", :as => :preview_forum_post 

然後一切都繼續工作;簡單的臨時修復。

+0

哇!謝謝!您的解決方法可行。奇怪的是,這樣的錯誤,應該很容易找到,可以通過... – Jonatan 2010-10-15 10:13:02