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

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

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

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

Q&A

0回答

1061閲覧

【Rails】いいね機能の非同期通信化がページをリロードしないと表示されない

rororo11

総合スコア1

Ruby on Rails

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

0グッド

0クリップ

投稿2021/12/24 10:34

編集2021/12/24 10:40

前提・実現したいこと

Rails初心者です。
Ruby on railsで、各ユーザーが投稿(Book)できるアプリを開発しています。
投稿一覧画面と投稿詳細画面に、非同期通信のいいね機能を実装しようとしていますが、ページをリロードしないと表示されません。
※備考
いいねは以下のように切り替わります。
いいね(0)  <=>  いいねを消す(1)

発生している問題・エラーメッセージ

Logには以下のようなメッセージが表示されました。
「undefined method `favorited_by?' 」とありますが、book.rbに定義しているので
原因がわかりません。

Started DELETE "/books/1/favorites" for 211.120.130.120 at 2021-12-24 06:11:36 +0000 Cannot render console from 211.120.130.120! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by FavoritesController#destroy as JS Parameters: {"book_id"=>"1"} User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.5/lib/active_record/log_subscriber.rb:98 Book Load (0.1ms) SELECT "books".* FROM "books" WHERE "books"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/controllers/favorites_controller.rb:9 Favorite Load (0.2ms) SELECT "favorites".* FROM "favorites" WHERE "favorites"."user_id" = ? AND "favorites"."book_id" = ? LIMIT ? [["user_id", 1], ["book_id", 1], ["LIMIT", 1]] ↳ app/controllers/favorites_controller.rb:10  (0.1ms) begin transaction ↳ app/controllers/favorites_controller.rb:11 Favorite Destroy (0.2ms) DELETE FROM "favorites" WHERE "favorites"."id" = ? [["id", 33]] ↳ app/controllers/favorites_controller.rb:11  (6.5ms) commit transaction ↳ app/controllers/favorites_controller.rb:11 Rendering favorites/destroy.js.erb Rendered favorites/_favorite.html.erb (3.2ms) Rendered favorites/destroy.js.erb (5.8ms) Completed 500 Internal Server Error in 27ms (ActiveRecord: 7.2ms) ActionView::Template::Error (undefined method `favorited_by?' for nil:NilClass): 1: <% if book.favorited_by?(current_user) %> 2: <td><%= link_to book_favorites_path(book.id), method: :delete, remote: true do %> 3: ♥<%= book.favorites.count %> いいね</td> 4: <% end %> app/views/favorites/_favorite.html.erb:1:in `_app_views_favorites__favorite_html_erb___640992299850121874_69917787488560' app/views/favorites/destroy.js.erb:1:in `_app_views_favorites_destroy_js_erb___1919995251382630832_69917787431440'

該当のソースコード

views/favorites/create.js.erb
views/favorites/delete.js.erb

$("#favorites_buttons_<%= @books %>").html("<%= j(render partial: 'favorites/favorite', locals:{book: @books})%>");

favorites_controller.rb

def create book = Book.find(params[:book_id]) favorite = current_user.favorites.new(book_id: book.id) favorite.save end def destroy book = Book.find(params[:book_id]) favorite = current_user.favorites.find_by(book_id: book.id) favorite.destroy end end

views/favorites/_favorite.html.erb

<% if book.favorited_by?(current_user) %> <td><%= link_to book_favorites_path(book.id), method: :delete, remote: true do %> ♥<%= book.favorites.count %> いいね</td> <% end %> <% else %> <td><%= link_to book_favorites_path(book.id), method: :post, remote: true do %> ♡<%= book.favorites.count %> いいね</td> <% end %> <% end %>

views/books/show.html.erb

<div id="favorite_btn_<%= @books.id %>"> <%= render partial: 'favorites/favorite', locals: { book: @books} %> </div>

views/books/_index.html.erb

<div id="favorite_btn_<%= book.id %>"> <%= render partial: 'favorites/favorite', locals: { book: book} %> </div>

books_controller.erb

def show @books = Book.find(params[:id]) @user = @books.user @book = Book.new @book_comment = BookComment.new end def index @book = Book.new @books = Book.all @user = current_user end

models/book.rb

class Book < ApplicationRecord belongs_to :user has_many :favorites, dependent: :destroy has_many :book_comments, dependent: :destroy def favorited_by?(user) favorites.where(user_id: user.id).exists? end validates :title, presence: true validates :body, presence: true, length: {maximum: 200} end

routes

Rails.application.routes.draw do get 'search/search' devise_for :users root 'homes#top' get 'home/about' => 'homes#about' get "users/show" => "users#show" get '/users' => "users#index" get "users/:id" => "users#show", as: :mypage get 'search' => "search#search" resources :users,only: [:show,:index,:edit,:update] do resources :relationships, only: [:create, :destroy] get :followings, on: :member get :followers, on: :member end resources :books do resource :favorites, only: [:create, :destroy] resources :book_comments, only: [:create, :destroy] end end

application.js

// This is a manifest file that'll be compiled into application.js, which will include all the files // listed below. // // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's // vendor/assets/javascripts directory can be referenced here using a relative path. // // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the // compiled file. JavaScript code in this file should be added after the last require_* statement. // // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details // about supported directives. // //= require jquery3 //= require popper //= require bootstrap-sprockets //= require jquery //= require rails-ujs //= require activestorage //= require turbolinks //= require_tree .

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

どうぞ宜しくお願い致します。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.43%

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

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

質問する

関連した質問