searchアクションのルーティングを設定しよう
今回はsearchという命名で、7つの基本アクション以外のアクションを定義します。 |
---|
collectionとmemberを学習します。
collectionとmember
collectionとmemberは、ルーティングを設定する際に使用できます。
これを使用すると、生成されるルーティングのURLと実行されるコントローラーを任意にカスタムできます。
collectionはルーティングに:idがつかない、memberは:idがつくという違いがあります。
1つずつ使用例を見ていきましょう。
【例】collectionで定義した場合
Rails.application.routes.draw do
resources :tweets do
collection do
get 'search'
end
end
end
【例】collectionのルーティング
Prefix Verb URI Pattern
search_tweets GET /tweets/search(.:format) tweets#search
ルーティングに:idが付いていないことがわかります。
続いてmemberの場合を見てみましょう。
【例】memberで定義した場合
Rails.application.routes.draw do
resources :tweets do
member do
get 'search'
end
end
end
【例】memberのルーティング
Prefix Verb URI Pattern
search_tweet GET /tweets/:id/search(.:format) tweets#search
URLの指定先が、collectionは:idなし、memberが:idありとなっていることが確認できますね。
今回の検索機能の場合、詳細ページのような:idを指定して特定のページにいく必要がないため、collectionを使用してルーティングを設定しましょう。
routes.rbを以下のように編集します。
config/routes.rb
Rails.application.routes.draw do
devise_for :users
root to: 'tweets#index'
resources :tweets do
resources :comments, only: :create
collection do
get 'search'
end
end
resources :users, only: :show
end