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

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

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

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

Ruby on Rails

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

JavaScript

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

Q&A

1回答

1706閲覧

いいね機能を非同期で実行

tomtom1

総合スコア168

Ruby

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

Ruby on Rails

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

JavaScript

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

0グッド

0クリップ

投稿2018/11/27 11:05

投稿にいいね!ができる機能がついていますが、クリックする度にサイドサーバーがから読み込まれる状況ですが、それを非同期でページの更新をなくしたいです。(FBやインスタグラムのように)

Ruby

1<% @posts.each do |post| %> 2 <h4><%= link_to(post.title, "/posts/#{post.id}") %></h4> 3 <% if Like.find_by(user_id: @current_user.id, post_id: post.id) %> 4 <%= link_to("/likes/#{post.id}/destroy", {method: "post"}) do %> 5 <span class="fa fa-heart like-btn-unlike"></span> 6 <% end %> 7 <% else %> 8 <%= link_to("/likes/#{post.id}/create", {method: "post"}) do %> 9 <span class="fa fa-heart like-btn"></span> 10 <% end %> 11 <% end %>

Controller

1class LikesController < ApplicationController 2 3 def create 4 @like = Like.new(user_id: @current_user.id, post_id: params[:post_id]) 5 @like.save 6 redirect_to("/posts/#{params[:post_id]}") 7 end 8 def destroy 9 @like = Like.find_by(user_id: @current_user.id, post_id: params[:post_id]) 10 @like.destroy 11 redirect_to("/posts/#{params[:post_id]}") 12 end 13end

Model

1class Post < ApplicationRecord 2 has_many :likes, dependent: :delete_all 3class Like < ApplicationRecord 4 belongs_to :post 5

おそらく、次のステップは非同期で行うために、link_toのオプションにremote: trueを入れて、リンクを押した時にajaxが発生する流れになるかと思いますが、調べても調べても把握できずにいます。
お力添えを頂ければ幸いです。

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

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

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

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

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

m.ts10806

2018/11/27 11:26 編集

実際にremote:trueを入れて動作させたのでしょうか。(Rails詳しくはないのですがリファレンスで確認した限りそれだけでAjax通信しそうですが)もう少し「何が分からないか」を具体的に記載された方が回答が得やすくなると思います。Ajax通信させて「いいね」数更新したら、その時点での「いいね」数を取得してAjaxのレスポンスとして返し、画面表示を(JavaScriptで)書き換える・・というところはRails限らず同じだと思うので、「今どの段階か」という記載は欲しいですね。
tomtom1

2018/11/27 11:52 編集

コメントありがとうございます!現段階としては、まずはremote: trueを入れて行けばいいのか..と把握している程度で、記述した内容からは進んでいません。現在、Controller内に記載があるように、saveあるいはdestroyをするとredirect_toの処理になっています。その場合、ページを更新してしまいます。そうではなく、非同期でクリックしたらページの移動或いは上位ページに戻る処理ではなく、その場所のままPOST処理を実行したいです。説明不十分で申し訳ありません。
guest

回答1

0

Railstutorial に取り組んだことはありますでしょうか?
いいね機能ではないですがフォローを非同期処理で行う方法が説明されています。
これを参考にしながらするといいのではないでしょうか?
Ruby on Rails チュートリアル 14.2.5 [Follow] ボタン (Ajax編)

投稿2018/11/28 04:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tomtom1

2018/11/30 08:30

ご回答ありがとうございます。大変参考になりました。 いきなりいいね!の実装ではなく、参考通りフォローに対してできるかを検証しました。 実際に取り入れてみたところ、非同期でフォローとフォロー解除ができるようになりました。 しかし、手動の更新無くして、フォローボタンとフォロー数に変化を与えることはできませんでした。 html: <p> フォロワー <%= @follower_count %>&nbsp;&nbsp;フォロー中 <%= @followed_count %></p> <% if @current_user != @user %> <% if @current_user.following?(@user) %> <%= button_to "フォロー中", friendship_path(user_id: @user.id), method: :delete, :remote=>true, :class => "follow-btn" %> <% else %> <%= button_to "フォローする", friendships_path(user_id: @user.id), method: :post, :remote=>true, :class => "follow-btn" %> <% end %> <% end %> create.js.erb $("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>"); $("#follower_count").html("<%= @follower_count %>"); $("#followers").html('<%= button_to "フォローする", friendships_path(user_id: @user.id), method: :post, :remote=>true, :class => "follow-btn" %>'); Destroy.js.erbもcreateと同じようなものでなので割愛しますが、 2列目と3列目の書き方はおかしいでしょうか? サイトの14.38を見る限り、このような書き方であると言う認識を持ちました。
退会済みユーザー

退会済みユーザー

2018/11/30 08:41

js.erbで表示を書き替えているはずですが id='follow_form'のdivタグやその他のdivタグも用意されてますか? コメントで見える範囲には書かれてないようですが... ajaxの部分だけでなく前後の説明も少し確認してみるといいかもしれませんね。
tomtom1

2018/11/30 12:30 編集

お付き合いありがとうございます。 $("#follow_form")にはそのような意味があったのですね。前後を読んで理解しました。 改めて多少修正も加えて、idも加えたのですがやはり結果は同じになってしまいました。 html: <strong id="following"> <p> フォロワー <%= @follower_count %></strong> <strong id="followers"> フォロー中 <%= @followed_count %></strong></p> <% if @current_user != @user %> <div id="follow_form"> <% if @current_user.following?(@user) %> <storng id="follower_btn"> <%= render 'unfollow' %> <% else %> <%= render 'follow' %> </storng> <% end %> </div> <% end %> _follow.js.erb : <%= button_to "フォローする", friendships_path(user_id: @user.id), method: :post, :remote=>true, :class => "follow-btn" %> _unfollow.js.erb : <%= button_to "フォロー中", friendship_path(user_id: @user.id), method: :delete, :remote=>true, :class => "follow-btn" %> create.js.erb $("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>"); $("#followers").html("<%= @follower_count %>"); $("#follower_btn").html('<%= button_to "フォローする", friendships_path(user_id: @user.id), method: :post, :remote=>true, :class => "follow-btn" %>'); 恐れ入りますがご指摘頂ければ幸いです。
tomtom1

2018/12/01 03:04 編集

また、Friendship Controllerは以下のようになります。 def create @current_user.follow(@user) respond_to do |format| format.html { redirect_to @user } format.js end 一行目のフォローのみ実行され、2行目のrespondの反応が見れずにいます。 現に一行目を削除しましたら、ボタンをフォローボタンをクリックして手動でページ更新しても フォローされていないです。 また確認ですが、/views/friendships内にcreate.js.erbとdestroy.js.erbファイルを保存しているのですが、保存先は正しいでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問