なんて言えばいいのか分からないのですが、こういうことをやりたい場合。
前提

【Rails】配列から重複を削除して表示するには?
こんなテーブルがあったとします。
title
headline
content
book1
自己啓発
アウトプットする
book1
ストレス解消
よく寝る
book2
レシピ...
これの続きの話なのですが、
title | headline | content |
---|---|---|
book1 | 自己啓発 | アウトプットする |
book1 | ストレス解消 | よく寝る |
book2 | レシピ | カレー |
というテーブルからtitleの重複を取り除き、
book1 |
book2 |
という配列を取り出しました。
その上で、例えばbook1をクリックすると、/book/title/book1とかいうページへ飛ぶようにするにはどうすれば良いか?という話です。
間違いなく、これよりもっと良い方法があるような気がしますが、私が思いついたのはこれ。
routes.rbの設定
1 2 3 4 5 |
Rails.application.routes.draw do (中略) get 'books/title/:title' => 'books#title' (中略) end |
URLを/book/:titleにすると、/book/newや/book/:idと被るので、苦し紛れにこんなURLに設定。
controller.rbの設定
ransackを使っていたので、
1 2 3 4 |
def index @search = Book.ransack(params[:q]) @books = @search.result end |
と設定。
ransackを使用していなければ、普通に
1 2 3 |
def index @books = Book.all end |
で良い。
index.html.erbの設定
1 2 3 4 5 |
<% @books.pluck(:title).uniq.each do |book| %> <div> <%= link_to book, "/books/title/#{book}" %> </div> <% end %> |
- <% @books.pluck(:title).uniq.each do |book| %>で、titleの配列を取り出し、その上で重複しているものを削除。
- <%= link_to book,で重複を取り除いた配列が取り出される。(今回の例で言えば「book1」、「book2」が並べられる)
- “/books/title/#{book}” %>というように変数展開を用いることで、そのtitle名がついたURLに飛ぶよう設定する
飛んだ先のviewは、title.html.erbファイルを作成する。
Progateやってた時に、showを変数展開を使って指定していたのを思い出したので、応用できないかと考えました。
もっと良い方法がありそうです・・・
追記
上記のやり方で実装はできるのですが、コードレビューをいただいた際に以下の問題点を指摘されました。
1:ルーティングにベタがきのURLを記述するのはよくない
できるだけresourcesやresourceを使って設定するほうが良いそうです。
じゃあどうすれば良いのかまではまだ思いつかないのですが。
2:viewに書きすぎ
viewには基本的に画面を表示させる物のみを記述したほうが良いです。
ということで、
1 |
<% @books.pluck(:title).uniq.each do |book| %> |
辺りの記述は、controllerやmodelに移したほうが良さそうです。
コメント