前提・実現したいこと
ruby on rails 6でSNSアプリを製作中、いいね機能をajaxを用いてサーバーと非同期で実装しようとしたところ、いいねの取り消しは非同期で実装できたのですが、いいねをする機能が非同期では実装できず、ブラウザをリロードしなければいいねができない状況です。サーバーのログには下記のActionView::Template::Errorが表示されてしまいました。
どこが原因かわからないのでコードをいかに載せておきます。。
宜しくお願いします。
質問などもあればよろしくお願いします。
発生している問題・エラーメッセージ
サーバーのログに表示されているエラー
ActionView::Template::Error (No route matches {:action=>"destroy", :book_id=>#<Book id: 302, title: "本1", author: "著者1", publisher: "出版社1", publish_year: 2000, user_id: 1, created_at: "2020-09-05 04:43: 3", updated_at: "2020-09-05 04:43:33", comment: "とても素晴らしい本です。\r\n">, :controller=>"likes"}, missing required keys: [:id]): 1: <%= form_with(url: book_like_path(@book), html: { method: :delete }, remote: true) do |f| %> 2: <%= f.submit "いいねを取り消す", class: "btn" %> 3: <% end %> app/views/likes/_unlike.html.erb:1 app/views/likes/create.js.erb:1
ブラウザのデベロッパーツールに表示されているエラー
POST https://12dac388e20f4c1f9f6629019404d368.vfs.cloud9.us-east-2.amazonaws.com/books/302/likes 500
該当のソースコード
routes.rb
Rails.application.routes.draw do root 'static_pages#home' get '/home', to: 'static_pages#home' get '/help', to: 'static_pages#help' get '/signup', to: 'users#new' get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' resources :users do member do get :following, :followers end end resources :books, only: [:show, :create, :destroy] do resources :likes, only: [:create, :destroy] end resources :relationships, only: [:create, :destroy] end
users/show.html.erbにいいねのフォームがあります
<div id="like_form"> <% if current_user.already_liked?(@book) %> <%= render 'likes/unlike' %> <% else %> <%= render 'likes/like' %> <% end %> </div>
likes/_like.html.erb
<%= form_with(url: book_likes_path(@book), remote: true) do |f| %> <%= f.submit "いいね", class: "btn" %> <% end %>
likes/_unlike.html.erb
<%= form_with(url: book_like_path(@book), html: { method: :delete }, remote: true) do |f| %> <%= f.submit "いいねを取り消す", class: "btn" %> <% end %>
likesコントローラー
class LikesController < ApplicationController def create @book = Book.find(params[:book_id]) @like = current_user.likes.create(book_id: params[:book_id]) respond_to do |format| format.html { redirect_to @book } format.js end end def destroy @book = Book.find(params[:book_id]) @like = Like.find_by(book_id: params[:book_id], user_id: current_user.id) @like.destroy respond_to do |format| format.html { redirect_to @book } format.js end end end
likes/create.js.erb
$("#like_form").html("<%= escape_javascript(render('likes/unlike')) %>"); $("#likes_count").html('<%= @book.likes.count %>'); $("#liked_by").html("<%= escape_javascript(render('books/liked_users')) %>");
likes/destroy.js.erb
$("#like_form").html("<%= escape_javascript(render('likes/like')) %>"); $("#likes_count").html('<%= @book.likes.count %>'); $("#liked_by").html("<%= escape_javascript(render('books/liked_users')) %>");
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/05 08:19
2020/09/05 08:42
2020/09/05 08:46 編集
2020/09/05 08:48