lebronkoukou
@lebronkoukou (光聖 西田)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

コメントに対していいね機能を実装したい

コメントに対していいね機能を実装したい

railsで悩みを投稿するアプリを作成しているのですが、投稿に対するコメントに投稿主のみが評価できる機能(いいね機能)を実装しているのですが、そのボタンをクリックした後にエラーが起きて困っています。

Image from Gyazo

各々コードはこんな感じ

class Gold < ApplicationRecord
  belongs_to :yell
  belongs_to :user
  validates_uniqueness_of :yell_id, scope: :user_id
end

上記はコメントに対する評価モデル。
ユーザーとエール(コメント)とのアソシエーションを記述そしてここで気づいたのですが、
この段階で評価をコメントとユーザーにしかアソシエーション記述していないのが問題なのでしょうか?(コメントは投稿に対して行うため投稿に対しても評価モデル(上記Goldモデル)でアソシエーションを書かないといけない?
またデータベース自体も同じように

class CreateGolds < ActiveRecord::Migration[6.0]
  def change
    create_table :golds do |t|
      t.references :yell, null: false, foreign_key: true
      t.references :user, null: false, foreign_key: true
      t.timestamps
    end
  end
end

と投稿に関して記述していません。また投稿コントローラのshowアクションは以下のような記述
(今回実装したいビューが投稿のshowのため)

def show
    @life = Life.find(params[:id])
    @lives = Life.all.order("created_at DESC")
    @like = Like.new
    @yell = Yell.new
    @yells = @life.yells
    @gold = Gold.new
  end

細かく説明すると今回の評価が@goldで投稿に対するいいね機能が@like
また評価であるgold controllerは以下のような記述

class GoldsController < ApplicationController
  before_action :authenticate_user!, only: [:create, :destroy]

  def create
    @gold = current_user.golds.create(life_id: params[:life_id], yell_id: params[:yell_id])
    redirect_back(fallback_location: root_path)
  end

  def destroy
    @gold = Gold.find_by(yell_id: params[:yell_id], user_id: current_user.id)
    @gold.destroy
    redirect_back(fallback_location: root_path)
  end
end

そして最後に該当するビューファイルがこちら

<div class="yell-lists">
      <% @yells.each do |yell| %>
        <div class="yell-content">
          <%= yell.content%>
          <%= yell.created_at.strftime("%m") %><%= yell.created_at.strftime("%d") %>日
        </div>
        <% if current_user.id == @life.user.id %>
          <%= button_to life_yell_golds_path(@life, yell), method: :post %>
        <% end %>
      <% end %>
    </div>
    <%= form_with model: [@life, @yell], class: 'yell-form', id: "form", local: true do |f| %>
      <div class="form-input">
        <%= f.text_field :content, class: 'form-yell', placeholder: '相手を思いやるエールを送りましょう!', id: "content" %>
      </div>
      <%= f.submit '送信', class: 'yell-submit', id: "submit" %>
    <% end %>
  </div>

すみません💦色が見にくいですがフォームウィズを用いて投稿に対してyell(コメント)を記述し、そのコメントを上記each文で出力しています。
その出力されたコメントへ評価ボタンを実装したいのですが、うまくいかず、、、、

自分で試したこと

実は最初はビューを表示する時点でエラーが起きQiitaのユーザー様に助けて頂いたのですが、その後はボタンを押すとエラーが起きてしまい、、、
おそらく最初に仮設していた評価モデルのアソシエーションに投稿モデルも紐づけないといけないのかと感じていますが、もしわかるかたがいらっしゃればお願い致します。

0

1Answer

テンプレート言語はembedded Rubyなんで「```erb」とするとシンタックスハイライトが効きます

<%= form_with model: [@life, @yell], class: 'yell-form', id: "form", local: true do |f| %>
  <div class="form-input">
    <%= f.text_field :content, class: 'form-yell', placeholder: '相手を思いやるエールを送りましょう!', id: "content" %>
  </div>
  <%= f.submit '送信', class: 'yell-submit', id: "submit" %>
<% end %>

まずrailsが出力したhtmlをブラウザのソースで見て、どういうaction URLなのか確認してみる。

Screen Shot 2021-06-11 at 8.44.36.png

ここに入力すると一致するrouteが表示される。同じrouteがあるか確認する(無いからエラー)。

routesは肝だし、マジックが多くて分かりにくいんで作業を中断して3回ぐらいまずは上から下まで読んだほうが早いと思いますよ。

0Like

Your answer might help someone💌