2016-10-25 23 views
1

我正在開發rails應用程序並遇到此類問題。Rails路由配置認爲操作方法是對象ID

我有movies_controller.rb,在那裏我有這些動作和路線定義:

  Prefix Verb URI Pattern     Controller#Action 
      movies GET /movies(.:format)    movies#index 
        POST /movies(.:format)    movies#create 
     new_movie GET /movies/new(.:format)   movies#new 
     edit_movie GET /movies/:id/edit(.:format) movies#edit 
      movie GET /movies/:id(.:format)   movies#show 
        PATCH /movies/:id(.:format)   movies#update 
        PUT /movies/:id(.:format)   movies#update 
        DELETE /movies/:id(.:format)   movies#destroy 
       root GET /       redirect(301, /movies) 
movies_by_director GET /movies/by_director(.:format) movies#by_director 

但是當我嘗試去/movies/by_director?director="something",導軌想,我導航到movies#show行動參數:id = by_director

我在做什麼錯?

回答

2

路由按照它們指定的順序進行匹配,因此請確保「by_director」的路由被定義爲高於電影的資源路由。

像這樣的東西應該做的伎倆:

get '/movies/by_director' => 'movies#by_director' 
resources :movies 
+0

它在行動。 :) 謝謝! –

1

有兩個問題在一個位置:

  1. :id匹配的默認模式是足夠鬆說by_director被解釋爲:id
  2. 路線按順序匹配,GET /movies/:id出現在GET /movies/by_director之前。

您可以手動將resources :movieinfused suggests之前定義GET /movies/by_director或者你可以添加一個約束,以縮小東西:id看看這樣的:

resources :movies, constraints: { id: /\d+/ } do 
    #... 
end 

手動排序路線是很好,如果有一個或兩個的他們處理,約束:id是(IMO)更乾淨,更不容易出錯。