【Rails】リンクした文字を含むURLのページを作成する

ブログを書いている人 Ruby、Ruby on Rails

ブログを書いている人

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

スポンサーリンク

前提

【Rails】配列から重複を削除して表示するには?
こんなテーブルがあったとします。 title headline content book1 自己啓発 アウトプットする book1 ストレス解消 よく寝る book2 レシピ...

これの続きの話なのですが、

title headline content
book1 自己啓発 アウトプットする
book1 ストレス解消 よく寝る
book2 レシピ カレー

というテーブルからtitleの重複を取り除き、

book1
book2

という配列を取り出しました。

 

その上で、例えばbook1をクリックすると、/book/title/book1とかいうページへ飛ぶようにするにはどうすれば良いか?という話です。

 

間違いなく、これよりもっと良い方法があるような気がしますが、私が思いついたのはこれ。

routes.rbの設定

URLを/book/:titleにすると、/book/newや/book/:idと被るので、苦し紛れにこんなURLに設定。

controller.rbの設定

ransackを使っていたので、

と設定。

 

ransackを使用していなければ、普通に

で良い。

index.html.erbの設定

  • <% @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には基本的に画面を表示させる物のみを記述したほうが良いです。

 

ということで、

辺りの記述は、controllerやmodelに移したほうが良さそうです。

コメント

タイトルとURLをコピーしました