個人アプリ開発 いいね機能の実装


いいね機能はチーム開発でも担当した箇所なので、復習がてらサクサク実装しました。
個人アプリでは、”行った”と”保存”の2つの機能があります。

f:id:kobegoro:20200822155436p:plain

記事詳細ページ

モデルの作成
[ターミナル]
$ 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に値をあげる。
→リスト表示(部分テンプレで繰り返し処理)

f:id:kobegoro:20200822171106p:plain


躓き

同様に”保存”の方も実装を行なっていきましたが、下記エラーが出て上手くいきません。
”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でした。

そんなことがあるのか。。。と大変勉強になりました笑

これから先エンジニアを続けていく限り、まだ見ぬエラーがたくさん待ち受けているかと思いますが、その都度柔軟に・スピーディーに解決ができるよう精進していきます。