我正在开发rails应用程序并遇到了这样的问题。
我有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
行动。
我做错了什么?
答案 0 :(得分:2)
路由按照指定的顺序进行匹配,因此请确保" by_director"的路由。定义以上电影的资源路径。
这样的事情可以解决问题:
get '/movies/by_director' => 'movies#by_director'
resources :movies
答案 1 :(得分:1)
这里有两个问题:
:id
的默认模式匹配非常宽松,by_director
被解释为:id
。GET /movies/:id
出现在GET
/movies/by_director
之前。您可以在GET /movies/by_director
作为infused suggests之前手动定义resources :movie
,或者您可以添加约束以缩小:id
的内容:
resources :movies, constraints: { id: /\d+/ } do
#...
end
如果只处理其中的一个或两个,手动排序路线很好,约束:id
(IMO)更清洁,更不容易出错。