🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

2回答

1157閲覧

rails いいね機能 送信されない

hurousyotoku500

総合スコア27

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/11/26 22:00

編集2020/11/27 04:13

現在、railsにてアプリ制作中ですが、メッセージにいいね機能を追加しております。
参考にしたサイトは、https://qiita.com/nojinoji/items/2c66499848d882c31ffaになります。

現状としては、いいねボタンをおしても、いいねが保存されない状況です。
恐らく、「<%= button_to 'いいね', {controller: 'likes', action: 'create'}, {method: :post } %>」か、ルーティングの書き方が間違っているような気がするのですが、どこが悪いのかわからない状況です。

いいねボタンを押した時の挙動

下記のエラーが出ている状況です。

いいねボタンを押した時のログ

Started POST "/likes" for ::1 at 2020-11-27 13:04:30 +0900 Processing by LikesController#create as HTML Parameters: {"authenticity_token"=>"qf1hIs6n7xzMfSiQpK8iFA6tzLn56nzlsLWlkVEP8Ls19Eu9SPJWyNMSUcoBXRFhb2XJaBO42q6FjLi7cqrG3w=="} User Load (1.1ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 4 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/controllers/likes_controller.rb:3:in `create' (0.2ms) BEGIN ↳ app/controllers/likes_controller.rb:3:in `create' Like Exists? (0.4ms) SELECT 1 AS one FROM `likes` WHERE `likes`.`message_id` IS NULL AND `likes`.`user_id` = 4 LIMIT 1 ↳ app/controllers/likes_controller.rb:3:in `create' (0.4ms) ROLLBACK ↳ app/controllers/likes_controller.rb:3:in `create' No template found for LikesController#create, rendering head :no_content Completed 204 No Content in 12ms (ActiveRecord: 2.2ms | Allocations: 5543)

ruby

1#view(show_message.html.erb) 2<h1>投稿詳細ページ</h1> 3<h3><%= @message.user.email %></h3> 4<h3><%= @message.content %></h3> 5<h3>いいね件数: <%= @message.likes.count %></h3> 6<% if current_user.already_liked?(@message) %> 7 <%= button_to 'いいねを取り消す', {controller: 'likes', action: 'destroy'}, {method: :delete } %> 8<% else %> 9 <%= button_to 'いいね', {controller: 'likes', action: 'create'}, {method: :post } %> 10<% end %> 11<h2>いいねしたユーザー</h2> 12<% @message.liked_users.each do |user| %> 13 <li><%= user.email %></li> 14<% end %> 15 16<%= link_to "ホームへ戻る", root_path %>

ruby

1#messages_controller.rb 2 def show 3 @message_course = params[:course] 4 @course_params = params[:course] 5 @messages = Message.where(course: params[:course]) 6 @like = Like.new 7 end 8 def show_message 9 @message = Message.find(params[:id]) 10 @like = Like.new 11 12 end
#likes_controller.rb class LikesController < ApplicationController def create @like = current_user.likes.create(message_id: params[:message_id]) # redirect_to root_path # redirect_back(fallback_location: root_path) end def destroy @like = Like.find_by(message_id: params[:message_id], user_id: current_user.id) @like.destroy # redirect_to root_path redirect_back(fallback_location: root_path) end end

ruby

1#routes.rb 2 get "/messages/index",to: 'messages#index' 3 get '/messages/show/:course', to: 'messages#show' ,as: "every_course_message" 4 get '/messages/show/:course/:id', to: 'messages#show_message' ,as: "message_show" 5 resources :likes, only: [:create, :destroy]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/11/26 23:44

押したときのログではなくメッセージ表示したときのログに見えるのですが、いかがでしょうか。 ボタンはフォームもなく、JavaScriptでイベントも登録してなければなにもしませんよ。
hurousyotoku500

2020/11/27 04:05

ご回答ありがとうございます。おっしゃる通り、getしかしていませんでした。 POSTのログは下記でした。 Started POST "/likes" for ::1 at 2020-11-27 13:04:30 +0900 Processing by LikesController#create as HTML Parameters: {"authenticity_token"=>"qf1hIs6n7xzMfSiQpK8iFA6tzLn56nzlsLWlkVEP8Ls19Eu9SPJWyNMSUcoBXRFhb2XJaBO42q6FjLi7cqrG3w=="} User Load (1.1ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 4 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/controllers/likes_controller.rb:3:in `create' (0.2ms) BEGIN ↳ app/controllers/likes_controller.rb:3:in `create' Like Exists? (0.4ms) SELECT 1 AS one FROM `likes` WHERE `likes`.`message_id` IS NULL AND `likes`.`user_id` = 4 LIMIT 1 ↳ app/controllers/likes_controller.rb:3:in `create' (0.4ms) ROLLBACK ↳ app/controllers/likes_controller.rb:3:in `create' No template found for LikesController#create, rendering head :no_content Completed 204 No Content in 12ms (ActiveRecord: 2.2ms | Allocations: 5543)
m.ts10806

2020/11/27 04:08

質問は編集できます。 しかし、エラーが出てます。質問内容と齟齬がありますね。 そのエラーの通り対応してみたのでしょうか。
hurousyotoku500

2020/11/27 04:14

失礼致しました。質問文も訂正させて頂きました。likes_controllerも抜けておりました。
m.ts10806

2020/11/27 04:19

ひとまず現状だと「エラーの通り」という回答になりますが、それで良いのでしょうか。
hurousyotoku500

2020/11/27 09:58

すみません、エラーを読んでみましたが、意味がよくわかりません。 No template found for LikesController#create, rendering head :no_contentのあたりでしょうか… likesに関しては、viewファイルは必要ないので、作っていないです。render・・・とありますが、renderしないといけないのでしょうか。
guest

回答2

0

Like Exists? (0.4ms) SELECT 1 AS one FROM `likes` WHERE `likes`.`message_id` IS NULL AND `likes`.`user_id` = 4 LIMIT 1

message_id が NULL で user_id が 4 の like が既に存在する可能性があります。
もしくはこの後に validates :message_id, presence: true に引っかかってるとか、
belongs_to :message, optional: false で弾かれてるとかです。

こういう時は create! と!を付けるとエラーを表示してくれます。
たとえば、belongs_to :user, optional: false なのに user_id が nil のまま保存しようとした時のエラー

ActiveRecord::RecordInvalid (Validation failed: User must exist)

message_id が NULL なのは params[:message_id] が nil だからです。
ログの Parameters にも含まれていません。

button_to でデータを POST するには下記のようにします。

<%= button_to likes_path, params: { message_id: @message.id } %>

Rails 6.0.3.4 で動作確認しました。

投稿2020/11/29 07:51

neko_daisuki

総合スコア2090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hurousyotoku500

2020/11/29 21:22

ご回答ありがとうございます。 <%= button_to likes_path, params: { message_id: @message.id } %> と変えてみて、ボタンを押したところ、「Routing Error」がでました。 URLは「http://localhost:3000/messages/show/%E5%8B%9D%E7%94%B0%E3%82%B4%E3%83%AB%E3%83%95%E5%80%B6%E6%A5%BD%E9%83%A8/20?message_id=20」を呼ぼうとしていますが、なぜこれが呼び出されるのかわかりません。 button_toの使い方がよくわかっておりませんが、likes#createが呼び出せない状況です。
neko_daisuki

2020/12/11 05:11 編集

もしかして、このボタンはフォームの中にありますか? <form action="/parent" method="post"> <%= button_to likes_path, params: { message_id: @message.id } %> </form> という風になっていると、 親のフォームで指定したPOST /parent に送信されるみたいです。
hurousyotoku500

2020/12/11 07:11

formタグでは囲ってはいないですね
guest

0

message_idが送信されていないためではないでしょうか。

<%= link_to 'いいね', likes_path(@message) %>

投稿2020/11/27 05:14

kickthekaz

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hurousyotoku500

2020/11/29 01:15

ご回答ありがとうございます。参考サイトもそのような記述になっており、その通り書いてみましたが、 「No route matches [GET] "/likes.4"」(4 はparams[:id])とエラーを吐きました。ルーティングはpostとdeleteのみなので、当然といえば当然かもれませんが、なぜgetしようとするのでしょうか。
kickthekaz

2020/11/29 05:56

<%= link_to 'いいね', likes_path(@message), method: :post %> もしくは、 <%= button_to 'いいね', likes_path(@message) %> でいかがでしょうか?
hurousyotoku500

2020/11/29 07:09

ご回答ありがとうございます。 両方試してみましたがPOSTされずでした。
kickthekaz

2020/11/29 07:52

<%= link_to 'いいね', likes_path(message_id: @message), method: :post %> もしくは、 <%= button_to 'いいね', likes_path(message_id: @message) %> もしくは、 <%= button_to 'いいね', {controller: 'likes', action: 'create', message_id: @message.id }, {method: :post } %> でどうでしょうか。
hurousyotoku500

2020/11/29 21:22

全て試してみましたが、やはり同じ状況でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問