はじめに
ポートフォリオ作成中に、評価された商品について、評価点ごとに商品を表示する機能を実装しようと試みました。
その際、ちょうどいい記事が見つからなかったので今回まとめてみました。
開発環境
ruby '3.0.0'
Rails 6.0.3.4
前提
下のような、評価をするためのモデル及びカラムが作成されており、投稿機能まで実装されているものとする。
ユーザが"ガジェット"を投稿するサイトにて、下のようなER図にてgadjet_pointを今回の評価点とする。
今回は、下画像のように10段階評価されたものについて、点数ごとの一覧画面を作成することを目標とする.
ルーティング
class Favorite < ApplicationRecord
.
.
.
resources :boards do
member do
get :stars
end
end
end
ボードコントローラに"stars"アクションを追加し、"stars"アクションにて、評価点(星の数)ごとの一覧画面を表示する。
ビューの作成
コントローラの前に、"stars"アクションを呼び出すビューを作成します。
今回は、した画像のようにヘッダーメニューから遷移できるようにする。
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle margin-left20" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Star
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<% i = 10 %>
<% until i == 0 do %>
<%= link_to "#{i}stars" , stars_board_path(id:i), class:"dropdown-item font-black" %>
<% i -= 1 %>
<% end %>
</div>
</div>
繰り返し処理にて、最初に"10"を代入し、繰り返す度に-1する。
stars_board_path(id:i)→starsアクションを実行するパスに"id"を評価点として受け渡すようにする。
コントローラ
class Favorite < ApplicationRecord
.
.
.
def stars
@gadjets = Gadjet.where(gadjet_point: params[:id])
@stars = params[:id]
end
end
Gadjetモデルのデータからgadjet_point(カラム名)が受け渡された評価点(:id)であるものを抽出。
評価点ごとの一覧画面
<div class="album py-5 bg-light">
<div class="container">
<h1 class="text-center margin-bottom25">星<%= @stars %></h1>
<%= render "shared/gajets-list", gadjets: @gadjets %>
#評価点別に抽出した@gadjetsをひとつづつ表示するviewを呼び出し。ここはご自身で作成願います。
</div>
</div>
終わりに
この実装方法は完全オリジナルであり、効率がより良い方法等があると思います。
間違い等がありましたら、コメントにてご指摘お願いいたします。
少しでも参考になれば幸いです。