kobasaです(´ω`*)もうセミ鳴いてますね。梅雨終わったらすぐ夏本番かなぁ。
ツイートアプリの復習漏れがあったので発展カリキュラムは日曜からになりました。
57日目の勉強内容
ルーティングのネスト
例えば、コメントはあるツイートの詳細画面でしかできない。という仕様だと
コメント(子要素)のURIにはどのツイートに対するものなのか判断する為に、必ずツイート(親要素)のidが必要になる。
このときルーティングをネストさせることで親要素のidをURIに含むことができる。
また、自分で7つのアクション以外の新しいアクションを作ったときも、どのコントローラーのアクションなのかを示すためにネストする必要があると思う。
ネストするには親要素のdo~end内に記述。
新しいアクションのルーティングを設定するときは
詳細情報(:id)が必要ならmemberを、不要ならcollectionを使用する。
resources :tweets do
resources :comments, only: :create
# ルーティングをネストすることでtweetのidをcommentsコントローラーに送れる
# rails routesのURI /tweets/:tweet_id/comments(.:format)
collection do
get 'search'
# 詳細表示(:id)が不要のためcollectionでオリジナルルーティングを作成。
# ツイートの検索をする機能(tweetsコントローラーのアクション)なのでtweetsにネストして記述。
# rails routesのURI /tweets/search(.:format)
end
end
ルーティングをネストしたときのform_with
ルーティングをネストしたときのform_withメソッドのモデルオプションは
[親要素, 子要素]と記述することで子要素を指定するとこができる。
<%= form_with(model: [@tweet, @comment], local: true) do |form| %>
データを検索する
whereメソッドとLIKE句を組み合わせることで、曖昧な文字列の検索ができる。
def self.search(search)
# searchメソッドを定義。引数にsearchを使用(検索ボックスの値)
if search != ""
Tweet.where('text LIKE(?)', "%#{search}%")
# 検索ボックスの値が空でなければツイートテーブルから検索ボックスの値を含む、textカラムのレコードを取得する
else
Tweet.all
# 検索ボックスの値が空白ならツイートテーブルから全てのレコードを取得する。
end
end
おまけ
リダイレクトやlink_toのパスで使用するidの値になる部分の式展開は
comment.tweet.idでもcomment.tweet_idでもどちらでも良いみたい。
ただしcomment.tweet.idはアソシエーションがないとエラーになる。
redirect_to "/tweets/#{comment.tweet.id}"
# commentテーブルに紐づくtweetテーブルのidの値
redirect_to "/tweets/#{comment.tweet_id}"
# commentテーブルのtweet_idカラムの値
コメント