質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby

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

Ruby on Rails

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

1回答

1467閲覧

非同期通信のいいね機能で出たエラーNo route matches

gen515

総合スコア5

Ruby

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

Ruby on Rails

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2021/05/15 02:22

解決したいこと

ruby on railsで写真を投稿してクイズを出すサービスを開発しているのですが、写真のクイズの回答に対していいね機能を実装したいのですがそこでいいねを押しても表示が切り替わりません。ちなみにいいね解除の時は表示が切り替わります。

発生している問題・エラー

ActionView::Template::Error (No route matches {:action=>"destroy", :answer=>#<Answer id: 15, content: "かか", user_id: 3, photo_id: 4, created_at: "2021-04-26 17:20:32", updated_at: "2021-04-26 17:20:32">, :controller=>"likes"}, missing required keys: [:id]): 1: <% if current_user.best_answers?(answer) %> 2: <%= link_to 'いいね解除', like_path(answer: answer), method: :delete, class: 'answer-unlike__enable', remote: true %> 3: <% else %> 4: <%= link_to 'いいね', likes_path(answer: answer), method: :post, class: 'answer-like__enable', remote: true %> 5: <% end %> app/views/likes/_like_button.html.erb:2:in `_app_views_likes__like_button_html_erb__2519850614983607465_47330826841800' app/views/likes/create.js.erb:1:in `_app_views_likes_create_js_erb__1829228261995845859_47330833940560'

該当するソースコード

likes_controller.rb

ruby

1class LikesController < ApplicationController 2 def create 3 @answer = Answer.find(params[:answer]) 4 current_user.like(@answer) 5 end 6 7 def destroy 8 @answer = Answer.find(params[:answer]) 9 current_user.unlike(@answer) 10 end 11end

photos/show.html.erb

ruby

1 2<p id="notice"><%= notice %></p> 3<div class="row"> 4 <div class="offset-md-3 col-md-5"> 5 <p> 6 <%= image_tag @photo.image.url if @photo.image? %> 7 </p> 8 <p> 9 <strong>クイズの問題:</strong> 10 <%= @photo.content %> 11 </p> 12 13 <%= link_to "回答する", new_photo_answer_path(@photo) %> 14 15 <ul class="list-unstyled"> 16 17 <% @answers.each do |answer| %> 18 19 <div class="media-body"> 20 <div style="border: solid 1px #000; margin-bottom: 8px;"> 21 <div class="user-name"> 22 ユーザ名:<%= answer.user.name %> <div id="answer_<%= answer.id %>" style="float: right;"><%= render 'likes/like_button', answer: answer %></div> 23 </div> 24 <div> 25 <%= answer.content %> 26 </div> 27 </div> 28 </div> 29 <% end %> 30 </ul> 31 <%= paginate @answers %> 32 </div> 33</div> 34 35<%= link_to '戻る', photos_path %> | 36<%= link_to '編集', edit_photo_path(@photo) %> 37

likes/_like_button.html.erb

<% if current_user.best_answers?(answer) %> <%= link_to 'いいね解除', like_path(answer: answer), method: :delete, class: 'answer-unlike__enable', remote: true %> <% else %> <%= link_to 'いいね', likes_path(answer: answer), method: :post, class: 'answer-like__enable', remote: true %> <% end %>

likes/create.js.erb

$("#answer_<%= @answer.id %>").html("<%= j(render 'likes/like_button', answer: @answer) %>")

likes/destroy.js.erb

$("#answer_<%= @answer.id %>").html("<%= j(render 'likes/like_button', answer: @answer) %>")

user.rb

class User < ApplicationRecord validates :name, presence: true, length: { maximum: 50 } validates :email, presence: true, length: { maximum: 255 }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i }, uniqueness: { case_sensitive: false } has_secure_password has_many :photos, dependent: :destroy has_many :answers has_many :likes has_many :best_answers, through: :likes, source: :answer def like(answer) self.likes.find_or_create_by(answer: answer) end def unlike(answer) like = self.likes.find_by(answer: answer) like.destroy if like end def best_answers?(answer) self.best_answers.include?(answer) end end

自分で試したこと

ご教授お願いします。足りないコードがあれば載せます。

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

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

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

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

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

guest

回答1

0

エラーの内容の

ActionView::Template::Error (No route matches {:action=>"destroy", :answer=>#<Answer id: 15, content: "かか", user_id: 3, photo_id: 4, created_at: "2021-04-26 17:20:32", updated_at: "2021-04-26 17:20:32">, :controller=>"likes"}, missing required keys: [:id]):

を翻訳を掛けてみると、
・テンプレートエラーですよ
・ルートが無いみたいです
・必要なキーの[:id]がありません

と言われています。コンソールでrails routesを打つとルートが出てくるかと思いますが、destroyの部分のルートが/answer/:id/みたいになっていると思います。
今はparams[:id]をlink_toで送っていないので、どのAnswer_idのカラムをdestroyルートに連れて行ってあげればいいのか分からなくなってエラーが起きている状態です。

ですので、

<%= link_to 'いいね解除', like_path(answer), method: :delete, class: 'answer-unlike__enable', remote: true %> def destroy @answer = Answer.find(params[:id]) current_user.unlike(@answer) end

にすれば直るかな~と思います

あくまで推測ですので、微修正必要かと思います。お試しください。

投稿2021/05/15 05:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問