前提・実現したいこと
当方、初心者です。
railsを使って、ブックレビューサイトを作成しています。
現在、ajaxを使ってお気に入り登録機能を追加しようとしているのですが、いいねボタンを押してもいいねが反映されず、リロードしないと反映されません。
リロードをせずにいいねが反映されるようにしたいです。
試したこと
参考URL
Ruby on railsいいね機能拡張
https://qiita.com/yukisaibai/items/0a84e8c02f423faa7891
500 internal server error エラーメッセージがデベロッパーツール上で表示されていましたが、いまは何のメッセージも表示されていません。
また、_favorite.html.erb内4行目の
<% favorite= Favorite.find_by(book_id: @book.id) %>
は、不要に思われるかもしれませんが、ない場合
undefined local variable or method `favorite'
と表示されてしまいます。
さらに、 _favorite.html.erb内5行目の
<%= button_to book_favorite_path(favorite, book_id: @book.id), method: :delete, class: "favorites-button", remote: true do %>
の引数favoriteを@favoriteに変えても、
No route matches {:action=>"destroy", :book_id=>63, :controller=>"favorites", :id=>nil}, possible unmatched constraints: [:id]
と表示され、うまくいきません。
補足情報(FW/ツールのバージョンなど)
rails 5.2.1
ruby 2.4.4
環境構築はVagrant+Virtualboxで行っています。
各ファイルの状態 _favorite.html.erb
<% if user_signed_in? %> <!-- お気に入りが存在するときの処理 --> <% if Favorite.exists?(user_id:current_user.id, book_id: @book.id) %> <% favorite= Favorite.find_by(book_id: @book.id) %> <%= button_to book_favorite_path(favorite, book_id: @book.id), method: :delete, class: "favorites-button", remote: true do %> <%= image_tag("star-on.png") %> <span> <%= @book.favorites_count %> </span> <% end %> <!-- お気に入りが存在しないときの処理 --> <% else %> <%= button_to book_favorites_path(@book), class: "favorites-button", remote: true, cache: false do %> <%= image_tag("star-off.png") %> <span> <%= @book.favorites_count %> </span> <% end %> <% end %> <!-- ログインしていないとき --> <% end %>
各ファイルの状態 routes.rb
Rails.application.routes.draw do get 'users/show' devise_for :users resources :users, only: :show resources :books, only: [:show, :index] do collection do get "search" end resources :reviews, only: [:new, :create, :edit, :update, :destroy] resources :favorites, only: [:create, :destroy] end root to: "books#index" end
###各ファイルの状態 favorites.controller
class FavoritesController < ApplicationController def create @favorite=Favorite.create(user_id: current_user.id, book_id: params[:book_id]) @book=Book.find(params[:book_id]) @favorites = Favorite.where(book_id: params[:book_id]) end def destroy favorite = Favorite.find_by(user_id: current_user.id, book_id: params[:book_id]) favorite.destroy @book=Book.find(params[:book_id]) @favorites = Favorite.where(book_id: params[:book_id]) end end
各ファイルの状態 create.js.erb
$(".favorite-buttons").html("<%= j(render partial: 'favorites/favorite', locals: { book: @book, favorites: @favorites, favorite: @favorite}) %>");
各ファイルの状態 destroy.js.erb
$(".favorite-buttons").html("<%= j(render partial: 'favorites/favorite', locals: { book: @book, favorites: @favorites, favorite: @favorite}) %>");
大変初歩的な質問で失礼します。お手数ですが、ご指摘よろしくお願いいたします。
あなたの回答
tips
プレビュー