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

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

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

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

Ruby on Rails 6

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Q&A

解決済

4回答

3802閲覧

再読み込みしないといいねが反映されない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails 6

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

0グッド

0クリップ

投稿2020/03/30 21:19

編集2020/03/30 21:20

前提・実現したいこと

現在、Rails6でインスタクローンアプリを作成しています。
今はいいね機能の実装中です。

以下のページを参考に、いいねボタンを押すとページの再読み込みなしで
1 いいねボタンの色が変わり
2 いいね数が1増える
描画をしたいと考えています。

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

画面上エラーメッセージは表示されませんが、googleのデベロッパーツールを見ると以下のエラーが表示されていました。

1つ目

Uncaught Error: Cannot find module 'bootstrap' at webpackMissingModule (application.js:10) at Object../app/javascript/packs/application.js(application.js:10) at _webpack_require_(bootstrap:19) at bootstrap:83 at bootstrap:83

2つ目

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)

該当のソースコード

_like.html.erb

_

1<% if !current_user?(micropost.user) %> 2 <span class="like"> 3 <% if micropost.make_like?(current_user) %> 4 <%= form_for(micropost.likes.find_by(user_id: current_user.id), method: :delete, remote: true) do |f| %> 5 <%= button_tag(class: "btn btn-default btn-xs") do %> 6 <i class="fas fa-heart unlike-btn"></i> 7 <%= content_tag :span, "#{micropost.likes_count}" %> 8 <% end %> 9 <% end %> 10 <% else %> 11 <%= form_for(micropost.likes.build, remote: true) do |f| %> 12 <div><%= hidden_field_tag :micropost_id, micropost.id %></div> 13 <%= button_tag(class: "btn btn-default btn-xs") do %> 14 <i class="far fa-heart like-btn" ></i> 15 <%= content_tag :span, "#{micropost.likes_count}" %> 16 <% end %> 17 <% end %> 18 <% end %> 19 </span> 20<% end %>

_micropost.html.erb

<li id="micropost-<%= micropost.id %>" data-micropost-id="<%= micropost.id %>"> <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %> <%= link_to micropost.user.name, micropost.user %> <span class="content"> <%= micropost.content %> <%= image_tag micropost.picture.url if micropost.picture? %> </span> <%= render 'likes/like', micropost: micropost %> <span class="timestamp"> <%= time_ago_in_words(micropost.created_at) %>前に投稿 <% if current_user?(micropost.user) %> <%= link_to "削除", micropost, method: :delete, data: { confirm: "削除してもよろしいですか?" } %> <% end %> </span> </li>

likes_controller.rb

rb

1class LikesController < ApplicationController 2 before_action :logged_in_user 3 4 def create 5 @micropost = Micropost.find(params[:micropost_id]) 6 unless @micropost.make_like?(current_user) 7 @micropost.make_like(current_user) 8 @micropost.reload 9 respond_to do |format| 10 format.html { redirect_to request.referrer || root_url } 11 format.js 12 end 13 end 14 end 15 16 def destroy 17 @micropost = Like.find(params[:id]).micropost 18 if @micropost.make_like?(current_user) 19 @micropost.remove_like(current_user) 20 @micropost.reload 21 respond_to do |format| 22 format.html { redirect_to request.referrer || root_url } 23 format.js 24 end 25 end 26 end 27end

micropost.rb

rb

1class Micropost < ApplicationRecord 2 belongs_to :user 3 has_many :likes, dependent: :destroy 4 has_many :make_like_users, through: :likes, source: :user 5 default_scope -> { order(created_at: :desc) } 6 mount_uploader :picture, PictureUploader 7 validates :user_id, presence: true 8 validates :content, presence: true, length: { maximum: 200 } 9 validates :picture, presence: true 10 validate :picture_size 11 12 def make_like(user) 13 likes.create(user_id: user.id) 14 end 15 16 def remove_like(user) 17 likes.find_by(user_id: user.id).destroy 18 end 19 20 def make_like?(user) 21 make_like_users.include?(user) 22 end 23 24 private 25 26 def picture_size 27 if picture.size > 5.megabytes 28 errors.add(:picture, "画像サイズを5MB以下にしてください") 29 end 30 end 31end

gemfile

1source 'https://rubygems.org' 2git_source(:github) { |repo| "https://github.com/#{repo}.git" } 3 4ruby '2.6.3' 5gem 'rails', '~> 6.0.2', '>= 6.0.2.1' 6gem 'bcrypt' 7gem 'faker' 8gem 'carrierwave' 9gem 'mini_magick' 10gem 'will_paginate' 11gem 'bootstrap-will_paginate' 12gem 'puma', '~> 4.1' 13gem 'bootstrap-sass' 14gem 'sass-rails', '>= 6' 15gem 'bootstrap' 16gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] 17gem 'webpacker', '~> 4.0' 18gem 'turbolinks', '~> 5' 19gem 'jbuilder', '~> 2.7' 20gem 'bootsnap', '>= 1.4.2', require: false 21gem 'rails-i18n' 22gem 'font-awesome-sass' 23gem 'counter_culture' 24 25group :development, :test do 26 gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] 27 gem 'rspec-rails' 28 gem 'sqlite3', '~> 1.4', require: false 29 gem 'factory_bot_rails' 30end 31 32group :development do 33 gem 'web-console', '>= 3.3.0' 34 gem 'listen', '>= 3.0.5', '< 3.2' 35 gem 'spring' 36 gem 'spring-watcher-listen', '~> 2.0.0' 37end 38 39group :production do 40 gem 'pg' 41 gem 'fog' 42end

routes.rb

rb

1Rails.application.routes.draw do 2 get 'likes/create' 3 get 'likes/destroy' 4 get 'sessions/new' 5 root 'main_page#main' 6 get '/signup', to: 'users#new' 7 get '/login', to: 'sessions#new' 8 post '/login', to: 'sessions#create' 9 delete '/logout', to: 'sessions#destroy' 10 get '/newpost', to: 'microposts#new' 11 resources :users do 12 member do 13 get :following, :followers 14 end 15 end 16 resources :microposts, only: [:create, :destroy] 17 resources :relationships, only: [:create, :destroy] 18 resources :testsessions, only: :create 19 resources :likes, only: [:create, :destroy] 20end

application.js

js

1require("@rails/ujs").start() 2require("turbolinks").start() 3require("@rails/activestorage").start() 4require("channels") 5require("bootstrap") 6require("@fortawesome/fontawesome-free")

試したこと

以下のサイトの方法を参考に対応しましたが、効果は見られませんでした。
https://teratail.com/questions/207172
https://blog.piyo.tech/posts/2018-08-11-gem-with-js-on-webpacker/

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

関係ありそうなものを抜粋いたします。
Rails 6.0.2.1
bootstrap (4.4.1)
bootstrap-sass (3.4.1)
turbolinks (5.2.1)
turbolinks-source (5.2.0)
webpacker (4.2.2)

イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明

ご回答のほどどうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

非同期処理での解決が難しいと考えたため、妥協案として同期処理をすることにいたしました。
ご回答いただいた皆様、ありがとうございました。

投稿2020/04/12 06:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

$ is not definedはjQueryが読み込まれていない又は
window.$にjqueryモジュールが割り当てられていない時に出ますので
jQueryがちゃんと読まれているか確認してみて下さい。

投稿2020/04/01 12:27

kumanoage333

総合スコア18

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

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

0

以下を試されましたか?

  1. application.jsにJQuery追加。

js

1・・・ 2require('jquery') 3require("bootstrap") 4require("@fortawesome/fontawesome-free")

2.config/webpack/envioroment.jsに以下追加。

js

1const {environment} = require('@rails/webpacker') 2 3environment.splitChunks() 4 5// JQuery用 ここから 6const webpack = require('webpack') 7environment.plugins.prepend( 8 'Provide', 9 new webpack.ProvidePlugin({ 10 $: 'jquery', 11 jQuery: 'jquery', 12 jquery: 'jquery', 13 }), 14); 15// ここまで 16 17module.exports = environment

投稿2020/03/31 01:14

mongolia

総合スコア133

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

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

mongolia

2020/03/31 01:21

それと、turbolinksを使っている場合は、JQueryも書き方を変える必要があるとのこと。 $(function(){ //なにかしらの処理 }); 上記は以下のように書く。 $(document).on('turbolinks:load', function() { //なにかしらの処理 });
退会済みユーザー

退会済みユーザー

2020/04/02 21:12 編集

mongolia様 回答ありがとうございました。 上記の件を試したところ、 ActionController::InvalidAuthenticityToken in LikesController#create というエラーが出ました。 こちらについては自力でもう少し調べてみます。
mongolia

2020/04/02 00:48

既に解決されているかもですが、そちら、Ajax通信するときによく出るやつです。 送信するdataに、以下の項目を追加することで回避できるとおもいます。 authenticity_token: $('meta[name="csrf-token"]').attr('content')}
退会済みユーザー

退会済みユーザー

2020/04/07 21:21

mongolia様 create.js.erb ''' $(document).on('turbolinks:load', function() { $("#micropost-<%= @micropost.id %>.like").html("<%= j(render "likes/like", micropost: @micropost) %>"); }); ''' destroy.js.erb ''' $(document).on('turbolinks:load', function() { $("#micropost-<%= @micropost.id %>.like").html("<%= j(render "likes/like", micropost: @micropost) %>"); }); ''' 上記のように修正いたしましたが、エラーの内容に変化は見られませんでした。 解決方法を模索中ですが、他に可能性のある原因はありますでしょうか。
mongolia

2020/04/07 23:18

上記をjs.erbファイルではなく、html.erbに書いたら動きますか? webpackerだとcreate.js.erbのような中身だと動かないかもと思いました。 理由は、webpacker使うと静的ファイルが生成されるからです。 そのため、サーバーサイドから動的な値を送信(<%= @micropost.id %>のように)はできないと考えます。 対策としてはgonというgemを使うなどです。 [https://qiita.com/jiko797torayo/items/f8962bec2eefbf0aacd9(https://qiita.com/jiko797torayo/items/f8962bec2eefbf0aacd9) ちなみにエラーは以下ですかね? >ActionController::InvalidAuthenticityToken in LikesController#create その場合は、以下の可能性もあります。 そちら、Ajax通信するときによく出るやつです。 送信するdataに、以下の項目を追加することで回避できるとおもいます。 authenticity_token: $('meta[name="csrf-token"]').attr('content')} https://qiita.com/r_ishimori/items/4f8db624e39d9e5ba459
退会済みユーザー

退会済みユーザー

2020/04/09 12:01

mongolia様 度々丁寧なご回答ありがとうございます。 現在 ActionController::InvalidAuthenticityToken in LikesController#create が出てきます。 加えてお伺いしたいのですが、 authenticity_token: $('meta[name="csrf-token"]').attr('content')} を挿入した後の記述は以下で合っておりますでしょうか? $(document).on('turbolinks:load', function() { authenticity_token: $('meta[name="csrf-token"]').attr('content')} $("#micropost-<%= @micropost.id %>.like").html("<%= j(render "likes/like", micropost: @micropost) %>"); });
guest

0

BootstrapはjQuery必須のフレームワークだったと思います。
2つ目のエラーはjQuery本体の読み込みがなくjQueryの記法を使おうとしたときに見られることが多いです。
1つ目はjQuery本体の読み込みがないことによりBootstrapが正しく動いていないのかなと。
確実にjQuery本体を読み込ませてください。

投稿2020/03/30 21:34

m.ts10806

総合スコア80875

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問