前提・実現したいこと
現在いいね機能を非同期でやりたいのですが、うまくいきません。
エラー画面は出ていません。
ユーザー(User)、投稿情報(UserInfo)、お気に入り(Favorite)というふうにモデルが作っています。
ユーザーが、他人の投稿情報に、お気に入りするといった流れになります。
現在の状況は、
・お気に入りボタン、解除ボタンを押してリロードしないと色が変わらない。
・お気に入りボタン、解除ボタンを押してリロードする前にデータベースを見ると、データの反映はされている。
というふうなものです。
該当のソースコード
こちらは投稿情報を表示しているindex.html.erbです。
ruby
1・ 2・(省略) 3・ 4<div id="favorites_buttons_<%= user_info.id %>"> 5 <%= render partial: 'favorites/favorite', locals: { user_info: user_info} %> 6</div> 7・ 8・(省略) 9・
こちらは、favorites/favoriteファイルです。上記のindexファイルにて、render partialで指定しているファイルになります。
ruby
1<% if user_signed_in? && user_info.user_id != current_user.id %> 2 <% if user_info.favorited_by?(current_user) %> 3 <p class="followed_btn"><%=link_to "お気に入り済", user_info_favorite_path(user_info.id, 1), class: "white", method: :delete, remote: true %></p> 4 <% else %> 5 <p class="follow_btn"><%=link_to "お気に入り", user_info_favorites_path(user_info.id), class: "white", method: :post, remote: true %></p> 6 <% end %> 7<% end %>
こちらはapplication.jsです。
javascript
1// This file is automatically compiled by Webpack, along with any other files 2// present in this directory. You're encouraged to place your actual application logic in 3// a relevant structure within app/javascript and only use these pack files to reference 4// that code so it'll be compiled. 5 6require("@rails/ujs").start() 7//require("turbolinks").start() 8require("@rails/activestorage").start() 9require("channels") 10//require('jquery') 11 12 13 14 15// Uncomment to copy all static images under ../images to the output folder and reference 16// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>) 17// or the `imagePath` JavaScript helper below. 18// 19// const images = require.context('../images', true) 20// const imagePath = (name) => images(name, true)
こちらはcreate.js.erbです。
ruby
1$('#js-favorites-buttons-for-board-<%= @user_info.id %>').html("<%= j(render partial: 'favorites/favorite', locals: {user_info: @user_info}) %>");
こちらはdestroy.js.erbです。
ruby
1$('#js-favorites-buttons-for-board-<%= @user_info.id %>').html("<%= j(render partial: 'favorites/favorite', locals: {user_info: @user_info}) %>") 2
こちらはfavoritesコントローラーです。
ruby
1・ 2・(省略) 3・ 4def create 5 @user_info = UserInfo.find(params[:user_info_id]) 6 favorite = current_user.favorites.build(user_info_id: params[:user_info_id]) 7 favorite.save 8 end 9 10 def destroy 11 @user_info = UserInfo.find(params[:user_info_id]) 12 favorite = Favorite.find_by(user_info_id: params[:user_info_id], user_id: current_user.id) 13 favorite.destroy 14 end 15・ 16・(省略) 17・
試したこと
お気に入り登録はkazukimatsumotoさん、Ajaxはnaberinaさんのサイトを、少し変更を加えて参考にさせていただいています。
はじめ、Ajaxのコードを丸々写して見たのですが、NoMethodErrorが出ていました( ; ; )
それを踏まえて、application.jsなどを変更したところ、現在に至ります。
gem 'jquery-rails'はインストール済み、サーバー再立ち上げもしています。
追記①:application.jsのrequire("turbolinks").start()をコメントアウトしましたが、変わりありませんでした。
追記②
こちらはお気に入りボタンを押した際のターミナルです。
Processing by FavoritesController#create as JS Parameters: {"user_info_id"=>"15"} UserInfo Load (0.5ms) SELECT `user_infos`.* FROM `user_infos` WHERE `user_infos`.`id` = 15 LIMIT 1 ↳ app/controllers/favorites_controller.rb:40:in `set_user_info' CACHE UserInfo Load (0.0ms) SELECT `user_infos`.* FROM `user_infos` WHERE `user_infos`.`id` = 15 LIMIT 1 [["id", 15], ["LIMIT", 1]] ↳ app/controllers/favorites_controller.rb:27:in `create' User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 10 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/controllers/favorites_controller.rb:28:in `create' (0.1ms) BEGIN ↳ app/controllers/favorites_controller.rb:29:in `create' UserInfo Load (0.2ms) SELECT `user_infos`.* FROM `user_infos` WHERE `user_infos`.`id` = 15 LIMIT 1 ↳ app/controllers/favorites_controller.rb:29:in `create' Favorite Create (0.2ms) INSERT INTO `favorites` (`user_id`, `user_info_id`, `created_at`, `updated_at`) VALUES (10, 15, '2020-10-06 11:47:52.759534', '2020-10-06 11:47:52.759534') ↳ app/controllers/favorites_controller.rb:29:in `create' (0.6ms) COMMIT ↳ app/controllers/favorites_controller.rb:29:in `create' Rendering favorites/create.js.erb Favorite Exists? (0.3ms) SELECT 1 AS one FROM `favorites` WHERE `favorites`.`user_info_id` = 15 AND `favorites`.`user_id` = 10 LIMIT 1 ↳ app/models/user_info.rb:24:in `favorited_by?' Rendered favorites/_favorite.html.erb (Duration: 1.7ms | Allocations: 940) Rendered favorites/create.js.erb (Duration: 1.9ms | Allocations: 1043) Completed 200 OK in 15ms (Views: 2.1ms | ActiveRecord: 2.4ms | Allocations: 7413)
追記③:application.jsのrequire('jquery')にコンソール上でエラーになっていたので、コメントアウトしました。またその後、ボタンを押すと以下のようなエラーが起きました。
VM298:1 Uncaught ReferenceError: $ is not defined at <anonymous>:1:1 at processResponse (rails-ujs.js:283) at rails-ujs.js:196 at XMLHttpRequest.xhr.onreadystatechange (rails-ujs.js:264)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。