2016-10-25 3 views
1

私はレールアプリケーションを開発中で、このような問題が発生しました。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"へ行くしようとすると、レールは、私は、パラメータ:id = by_directormovies#showアクションに移動してることを、考えます。

私は間違っていますか?

答えて

2

ルートは指定された順番で一致しますので、「by_director」のルートがを超えていて、ムービーのリソースルートがになっていることを確認してください。ここでは1に2つの問題がある

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

:)ありがとう! –

1

:このような

何かがトリックを行う必要があります

  1. :idのためのマッチングデフォルトのパターンがby_director:idとして解釈されていることを十分に緩んでいます。
  2. 経路が順番に一致し、GET /movies/:idGET /movies/by_directorの前に表示されます。

手動であなたのresources :movieinfused suggestsとして前GET /movies/by_directorを定義することができます。また、:id sがどのように見えるかを狭めるために、制約を追加することができます。

1つか2つのあります場合は、手動でルートを注文
resources :movies, constraints: { id: /\d+/ } do 
    #... 
end 

は大丈夫ですそれらに対処するには、制約が:id(IMO)クリーナーであり、エラーが発生しにくい。

関連する問題