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でコメントに対してのいいね機能の実装

投稿に対するコメントへの評価機能を実装したい

現在railsで悩みを投稿するアプリを開発しており、その悩みについてコメントと共感ボタン(いいね機能)を実装したのですが、コメントに対して悩みを投稿したユーザーが評価(参考になったなど)できるようにコメントに対してもいいね機能のような実装ができればいいと考え実装中なのですが、実際にブラウザで表示するとエラーが起きてしまいます。

今回実装したいビューはこちら

Image from Gyazo

上記のように自由に投稿した悩み(上記テキストはテストなので適当ですが)に対してエール(ただのコメント機能)を既に実装しており、そのコメントに対して悩みの投稿主が評価できる機能を実装したく開発中です。

各々事前準備はこんな感じ

まずはいいね機能同様モデル(今回はgoldモデル)をrails gで作成し各々userとyellに対してreferenceを記述

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

その後migrateした後にモデルを記述

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

ルーティングはこんな感じ

resources :lives, only: [:index, :new, :create, :show] do
    collection do
      get 'search'
    end
    resources :likes, only: [:create, :destroy]
    resources :yells, only: [:index, :create] do
      resources :golds, only: [:create, :destroy]
    end
  end

長ったらしいですがlivesが投稿でそこにいいね機能としてyellsがネストしておりさらにそこにgoldsという評価機能のためのルーティングを記述しております。

goldsコントローラーはこんな感じ

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

  def create
    @gold = current_user.golds.create(yell_id: params[:yell_id], life_id: params[:life_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

上記ではいいね機能実装の際のコーディングを参考にしているためおそらくここで問題があるように考えているものの具体的には分からず、、

エラー文としてはこんな感じ

Image from Gyazo

該当するソースコードがこちら

<div class='yells-box'>
    <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(yell.id), class: "box-icon"  %>
        <% 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>

ちなみに問題がある箇所が上記9行目

自分の仮説

僕としては投稿に対するいいね機能は問題なかったため手順としては上記のような流れで問題ないかとは思うのですが、
パスの指定でIDを指定するあたりに問題があると仮説を立てました。
ただそこからなかなか作業が進まず、、、、
皆様お忙しいとは思いますがお分かりになる方いらっしゃいましたらどうぞよろしくお願い致します。

0

2Answer

多分そのrouteはPOSTじゃないかと。

Railsのルーティングを極める_前編_|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社.png

prypry-rails入れて

$ rails c

> show-routes

してみると分かりやすいかも。

  • GET
  • POST
  • PATCH
  • DELETE

methodオプション...

1Like

Comments

  1. @lebronkoukou

    Questioner

    ありがとうございます!!
    そこに関しては問題ないように見えて、、
    もしよろしければ下記リンクにて少し細かく記載しているため参照いただけると幸いです。
    でも十分救われました!^0^
    ありがとうございます。
    https://qiita.com/lebronkoukou/questions/a414c636b396622a7372
    もし「しゃあねーなー、もちっと付き合ってやっるよ」と駆け出しエンジニアに救いの手を差し伸べてくださるなら上記URL見てくれるとありがたいです。
<% if current_user.id == @life.user.id %>
  <%= button_to life_yell_golds_path(yell.id), class: "box-icon"  %>
<% end %>

..._path(yell.id)が多分良くなくて、..._path(yell)または..._path(yell_id: yell.id)じゃないかと。そうすると多分lifeオブジェクトも要ると思います。

<%= button_to life_yell_golds_path(@life, yell), class: "box-icon"  %>

0Like

Comments

  1. @lebronkoukou

    Questioner

    返信ありがとうございます!!!
    おっしゃって頂いた記述でビュー表示できました!!
    ただその後の評価(golds)のクリエイトアクションがボタンをクリックした後でNo routes matchになってしまって、、、
    僕としてはパスはこれで合っているためコントローラーなどで記述に穴があるかとは思うのですが、
    その先がわからず、、
    <% if current_user.id == @life.user.id %>
    <%= button_to life_yell_golds_path(@life, yell), method: :post, class: "box-icon" %>
    <% end %>
    上記で表示はできたのですが、ボタンを押すとエラーが起きて、、
    コントローラーは以下のような記述
    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
    もしお分かりの方がいらっしゃいましたらどうぞよろしくお願い致します。

Your answer might help someone💌