前提・実現したいこと
railsで本の感想アプリを作っています。
いいねの機能の非同期通信化を実装している際に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
Completed 500 Internal Server Error in 128ms (ActiveRecord: 4.8ms) NoMethodError (undefined method ` ' for #<FavoritesController:0x00007f628e4a0400>): いいねをしてもリロードしないと反応なし。しかし、いいねを外すのはリロードなしでも反応している。
該当のソースコード
/bookers2-debug/app/views/books/show.html.erb
<td > <div id="favorites_buttons_<%= @book.id %>" > <%= render 'favorites/favorite-btn', book: @book %> </div> </td>
/bookers2-debug/app/views/books/index.html.erb
<%= render 'index', books: @books ,book: @book,user: @user %>
/bookers2-debug/app/views/books/_index.html.erb
<td> <div id="favorites_buttons_<%= book.id %>" > <%= render 'favorites/favorite-btn', book: book %> </div> </td>
/bookers2-debug/app/views/favorites/_favorite-btn.html.erb
(いいね機能のテンプレートファイル)
<% if book.favorited_by?(current_user) %> <%= link_to book_favorites_path(book.id), method: :delete, class: "favorite_btn", remote: true do %> ♥<%= book.favorites.count %> <% end %> <% else %> <%= link_to book_favorites_path(book.id), method: :post, class: "favorite_btn", remote: true do %> ♡<%= book.favorites.count %> <% end %> <% end %>
/bookers2-debug/app/controllers/favorites_controller.rb
(いいね機能のコントローラー)
def create @book = Book.find(params[:book_id]) @favorite=current_user.favorites.new(book_id: @book.id) @favorite.save(NoMethodError が起きた行です) # redirect_to request.referer end def destroy @book = Book.find(params[:book_id]) @favorite=current_user.favorites.find_by(book_id: @book.id) @favorite.destroy # redirect_to request.referer end
/bookers2-debug/app/views/favorites/create.js.erb
$('#favorites_buttons_<%= @book.id %>').html("<%= j(render partial: 'favorites/favorite-btn', locals: {book: @book}) %>");
/bookers2-debug/app/views/favorites/destroy.js.erb
$('#favorites_buttons_<%= @book.id %>').html("<%= j(render partial: 'favorites/favorite-btn', locals: {book: @book}) %>");
/bookers2-debug/app/models/book.rb
belongs_to :user validates :title, presence: true validates :body, presence: true, length: {maximum: 200} has_many :favorites, dependent: :destroy def favorited_by?(user) favorites.where(user_id: user.id).exists? end
/bookers2-debug/app/models/favorite.rb
(いいね機能のモデル)
belongs_to :user belongs_to :book validates_uniqueness_of :book_id, scope: :user_id
/bookers2-debug/app/models/user.rb
has_many :favorites,dependent: :destroy has_many :books,dependent: :destroy attachment :profile_image, destroy: false
/bookers2-debug/app/javascript/packs/application.js
console.log('Hello World from Webpacker') require("@rails/ujs").start() require("turbolinks").start() require("@rails/activestorage").start() require("channels") require('jquery')
/bookers2-debug/config/webpack/environment.js
const { environment } = require('@rails/webpacker') const webpack = require('webpack') environment.plugins.prepend('Provide', new webpack.ProvidePlugin({ $: 'jquery/src/jquery', jQuery: 'jquery/src/jquery' }) ) module.exports = environment
/bookers2-debug/Gemfile
(追加した文)
gem 'webpacker' gem 'jquery-rails'
全体のルーティング(一部抜粋)
edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update book_book_comments POST /books/:book_id/book_comments(.:format) book_comments#create book_book_comment DELETE /books/:book_id/book_comments/:id(.:format) book_comments#destroy book_favorites DELETE /books/:book_id/favorites(.:format) favorites#destroy POST /books/:book_id/favorites(.:format) favorites#create books GET /books(.:format) books#index POST /books(.:format) books#create new_book GET /books/new(.:format) books#new edit_book GET /books/:id/edit(.:format) books#edit book GET /books/:id(.:format) books#show PATCH /books/:id(.:format) books#update PUT /books/:id(.:format) books#update DELETE /books/:id(.:format) books#destroy
試したこと
NoMethodエラーということなので、favoritesコントローラーの定義の見直しなど。
補足情報(FW/ツールのバージョンなど)
ruby '2.6.3'
'rails', '~> 5.2.5'
JavaScriptの基礎は一通り勉強して、初めて非同期通信に挑戦中です。
未熟な点もあるとは思いますが、よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。