#基本アクションのおさらい
#自分でアクションを定義する
上記の基本アクション以外の処理を行いたい場合は自身で定義することができます。
その際のルーティングの定義方法にはcollectionとmemberが使えます
Rails.application.routes.draw do
resources :hoges do
collection do
HTTPメソッド 'オリジナルのメソッド名'
end
end
end
Rails.application.routes.draw do
resources :hoges do
member do
HTTPメソッド 'オリジナルのメソッド名'
end
end
end
違いとしては、生成されるルーティングにidが付くか、付か無いかです。
・collection → :idなし
・member → :idあり
特定のページへ遷移する必要がある場合などは、memberを使うといった感じです。
そして、重要なのは、どこにメソッドの内容を記述するかです。
一般的に、開発現場などでも、テーブル(DB)とのやりとりに関するメソッドはモデルに記載するのが通例らしいです。
例えば、検索機能を実装したい時なんかはその処理を行うメソッドをモデルに書き、コントローラーで呼び出します(viewの検索フォームなどの記述は省略します)
#使用例
resources :tweets do
collection do
get 'search'
end
end
class Tweet < ApplicationRecord
#省略
def self.search(search)
return Tweet.all unless search
Tweet.where('text LIKE(?)', "%#{search}%")
end
end
class TweetsController < ApplicationController
#省略
def search
@tweets = Tweet.search(params[:keyword])
end
end
それぞれを説明すると、
まず、searchアクションのルーティングを設定します。検索結果を表示するには、詳細ページに行く必要がなく、そのため、collectionを使っています。
formでユーザーが検索を行うと、controllerでsearchアクションからモデルに記述したsearchメソッドを呼び出します。その際、引数として検索結果を渡しています(params[:keyword])
検索結果はモデルのsearchメソッドの中で変数searchに代入されメソッド内で使用できるようになります。
処理の内容は、searchの中身が空なら全ての投稿を取得し、値が入っているならwhereメソッドの中身の条件式に一致した投稿を取得します。