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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1073閲覧

いいね機能の非同期通信が実装できません

manami0419

総合スコア10

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/10/06 10:11

編集2020/10/06 12:10

前提・実現したいこと

現在いいね機能を非同期でやりたいのですが、うまくいきません。
エラー画面は出ていません。

ユーザー(User)、投稿情報(UserInfo)、お気に入り(Favorite)というふうにモデルが作っています。
ユーザーが、他人の投稿情報に、お気に入りするといった流れになります。

現在の状況は、
・お気に入りボタン、解除ボタンを押してリロードしないと色が変わらない。
・お気に入りボタン、解除ボタンを押してリロードする前にデータベースを見ると、データの反映はされている。
というふうなものです。

該当のソースコード

こちらは投稿情報を表示しているindex.html.erbです。

ruby

12・(省略) 34<div id="favorites_buttons_<%= user_info.id %>"> 5 <%= render partial: 'favorites/favorite', locals: { user_info: user_info} %> 6</div> 78・(省略) 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

12・(省略) 34def 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 1516・(省略) 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)

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

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

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

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

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

guest

回答1

0

自己解決

indexにて、以下の記述をすることで解決しました。
考えていただいた方、ありがとうございました。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>

投稿2020/10/07 03:28

manami0419

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問