個人アプリ開発 いいね機能の実装
いいね機能はチーム開発でも担当した箇所なので、復習がてらサクサク実装しました。
個人アプリでは、”行った”と”保存”の2つの機能があります。
記事詳細ページ
モデルの作成
[ターミナル] $ rails g model Went user:references group:references $ rails db:migrate
モデルの編集
[group.rb] has_many :wents, dependent: :destroy [user.rb] has_many :wents, dependent: :destroy
ルーティングの編集
resources :groups do resources :wents, only: [:create, :destroy] end
コントローラー作成
[terminal] $ rails g controller Wents create destroy
コントローラー編集
[wents_controller.rb] before_action :set_group def create @went = Went.create(user_id: current_user.id, group_id: params[:group_id]) @wents = Went.where(group_id: params[:group_id]) @group.reload end def destroy went = Went.find_by(user_id: current_user.id, group_id: params[:group_id]) went.destroy @wents = Went.where(group_id: params[:group_id]) @group.reload end private def set_group @group = Group.find(params[:group_id]) end
ビュー作成
[wents/_went.html.haml] - if Went.find_by(user_id: current_user.id, group_id: group.id) = link_to group_went_path(group_id: group.id, id: group.wents[0].id), method: :delete, remote: true do .went-btn__wrapper %i.fas.fa-flag %span 行った - else = link_to group_wents_path(group), method: :post, remote: true do .went-btn__wrapper %i.far.fa-flag %span 行った
[groups/show.html.haml] ーーー追記ーーー %div{id: "went-#{@group.id}", class: "went-btn"} = render "wents/went", group: @group
[wents/create.js.haml] $("#went-#{@group.id}").html("#{j(render partial: 'went', locals: { group: @group })}"); [wents/destroy.js.haml] $("#went-#{@group.id}").html("#{j(render partial: 'went', locals: { group: @group })}");
これで”行った”を押すとDBに情報が入るようになりました。
マイページ
ビューの編集
.user_show__main__title %h1 行った水族館 - if @user.wents.nil? %p.went-none 行った水族館はありません - elsif @user.wents.length == 0 %p.went-none 行った水族館はありません - else = render "common/lists"
条件分岐で表示を変えました。
コントローラの編集
[users_controller.rb] ーーー追記ーーー @groups = current_user.went_groups
@groupsに値をあげる。
→リスト表示(部分テンプレで繰り返し処理)
躓き
同様に”保存”の方も実装を行なっていきましたが、下記エラーが出て上手くいきません。
”uninitialized constant Group::Safe”
”保存”のCreateはできるが、Destroyを行うとエラーが出ます。
→デバックを試みるが問題は無し。
JSのエラーも出ていませんし、パラメータも送られています。
→念のため、タイプミスや記述漏れなど確認しましたが、問題無し。
▶︎エラー内容を再度確認してみました。
Groupの"Safe"の定数が初期化されていませんよ、と怒られています。
Safeに値が入ってない。。。。Safeってなんだ??笑
おそらくSaves(複数形)から自動的にSafe(単数形)を判断し、Safeの値が無いよと教えてくれているよう。
そういえばパスも下記になっていました。
saves#create → group_saves_path
saves#destroy → group_safe_path
命名が悪かったようなので、モデル・コントローラ名をSaveからLikeに変更してみると、OKでした。
そんなことがあるのか。。。と大変勉強になりました笑
これから先エンジニアを続けていく限り、まだ見ぬエラーがたくさん待ち受けているかと思いますが、その都度柔軟に・スピーディーに解決ができるよう精進していきます。