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

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

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

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

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

Q&A

1回答

1763閲覧

リロードしないといいね機能が反映されない

yuu0000

総合スコア4

Ruby

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

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

0グッド

0クリップ

投稿2021/05/28 10:19

ajaxでいいね機能を実装できるようにしたい

現在、ユーザーが特定の投稿にいいねをできる機能をajaxを用いて実装をしているのですが、リロードをしないと反映されない状態です。

エラーなどはありませんが、リロードをしないといいね機能が反映されない原因をご教授願えますでしょうか。

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

エラーなどは特に起きていないのですが、リロードをしないと反映されない状態なので、どの部分に処理ができない原因を突き止めたいです。

該当のソースコード

app/views/uploads/index.html.erb

erb

1<div class="star-btn" id="favorite_"<%= upload.id %> 2 <%= render partial: "favorites/favorite", locals: {upload: upload} %> 3</div>

app/views/favorites/_favorite.html.erb

erb

1<% if user_signed_in? %> 2 <% if upload.favorited_by?(current_user) %> 3 <%= link_to upload_favorites_path(upload.id), method: :delete, remote: true do %> 4 <i>いいねを外す</i> 5 <% end %> 6 <span><%= upload.favorites.count %></span> 7 <% else %> 8 <%= link_to upload_favorites_path(upload.id), method: :post, remote: true do %> 9 <i>いいねをする</i> 10 <% end %> 11 <span><%= upload.favorites.count %></span> 12 <% end %> 13<% end %>

app/views/favorites/create.js.erb

erb

1$('#favorite_<%= @upload.id %>').html("<%= j(render partial: "favorites/favorite", locals: { upload: @upload}) %>");

app/views/favorites/destroy.js.erb

erb

1$('#favorite_<%= @upload.id %>').html("<%= j(render partial: "favorites/favorite", locals: { upload: @upload}) %>");

app/config/routes

ruby

1Rails.application.routes.draw do 2 devise_for :users 3 get 'uploads/index' 4 root to: "uploads#index" 5 resources :uploads do 6 resource :favorites, only: [:create, :destroy] 7 end 8 9 resources :users, only: [:show, :edit, :update] do 10 get :favorites, on: :collection 11 end 12end

app/controllers/favorites_controller

controller

1Rails.application.routes.draw do 2 devise_for :users 3 get 'uploads/index' 4 root to: "uploads#index" 5 resources :uploads do 6 resource :favorites, only: [:create, :destroy] 7 end 8 9 resources :users, only: [:show, :edit, :update] do 10 get :favorites, on: :collection 11 end 12end

app/models/favorite.rb

model

1class Favorite < ApplicationRecord 2 3 belongs_to :upload 4 belongs_to :user 5 6 validates_uniqueness_of :upload_id, scope: :user_id 7end 8

Gemfile

gem

1gem "jquery-rails" 2

app/javascript/packs/application.js

js

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 6import Rails from "@rails/ujs" 7import Turbolinks from "turbolinks" 8import * as ActiveStorage from "@rails/activestorage" 9import "channels" 10 11// Bootstrap 12//= require underscore 13//= require gmaps/google 14//= require bootstrap-sprockets 15//= require jquery 16Rails.start() 17// Turbolinks.start() 18ActiveStorage.start() 19require("../menu") 20require("../slick")

試したこと

・部分テンプレートでjsを呼び出すためのremote: trueでfavoritesディレクトリ内にあるcreate.js.erbdestroy.js.erbを呼び出し非同期処理を行えるようにしたが、リロードしないと反映されない
・非同期処理するためのjavascriptが呼ばれていないことが原因かもしれないと思いgemfilejqueryをダウンロードしているか確認してみたが、bundle installでダウンロードされていることが確認できたため、この部分とは別に原因があると思った。

###参考にした文献

Qiita
Qitta
Qiita

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

開発環境
・rubymine
・ruby(3.0.1)
・Ruby on rails (6.1.3.1)

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

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

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

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

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

yambejp

2021/05/28 10:32

> ajaxを用いて実装 それらしい箇所が見当たりませんが・・・
yuu0000

2021/05/28 12:00

ご連絡ありがとうございます! 今回の実装の場合、javscriptでajaxを記述する方法というよりはremote: trueメソッドで部分テンプレートを呼び出し非同期通信のようないいね機能の実装をしているという形になります。
guest

回答1

0

XHRないしfetchでAPIからの戻り値をみて「いいね」の画像や文字を切り替えればよいです

投稿2021/05/28 10:32

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問