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

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

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

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

Ruby on Rails

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

Ajax

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

Q&A

解決済

3回答

1647閲覧

railsのフォロー機能の非同期通信でデータ上では動いているが、見た目に変化がない

ryousukesatou

総合スコア19

Ruby

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

Ruby on Rails

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

Ajax

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

0グッド

0クリップ

投稿2020/01/10 13:30

編集2020/01/11 05:08

前提・実現したいこと

railsでフォロー機能を非同期で実装しようとしているのですが、データはしっかり動いて、フォロー、アンフォローはできているのですが、見た目に変化がないんです。
エラーぽいのがターミナルででているのですが、わかりません。2つ合ったのでどちらも載せときます。
フォロー機能は実装できているので、ajax部分のコードを書いています。

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

1 Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by EndUser::RelationsController#destroy as JS Parameters: {"utf8"=>"✓", "authenticity_token"=>"8Sc0zGvEqmHmzkUFQ5q2hFTuiQ1iPwfJrHa7w1qKaA+uS1KWULkOvJowqXNk/c2JGAqDe6Qigevi/ZGhSOGgbA==", "user_id"=>"3", "commit"=>"Unfollow"} 2  ActionView::Template::Error (Missing partial users/_follow with {:locale=>[:en], :formats=>[:js, :html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in: * "/vagrant/Make_Memories/app/views" * "/var/lib/gems/2.5.0/gems/devise-4.7.1/app/views" * "/var/lib/gems/2.5.0/gems/kaminari-core-1.1.1/app/views" ): 1: $("#follow_form").html("<%= escape_javascript(render("users/follow")) %>");

該当のソースコード

Ruby

1relationscontrolloer 2 3class EndUser::RelationsController < ApplicationController 4 before_action :set_user 5 6 def create 7 following = current_user.follow(@user) 8 respond_to do |format| 9 format.html { redirect_to @user } 10 format.js 11 end 12 end 13 14 def destroy 15 following = current_user.unfollow(@user) 16 respond_to do |format| 17 format.html { redirect_to @user } 18 format.js 19 end 20 end 21 22 private 23 def set_user 24 @user = User.find(params[:user_id]) 25 end 26end

ruby

1app/views/end_user/users/_follow.html.erb 2<%= form_with url: end_user_relation_path, remote: true do |f| %> 3 <%= f.hidden_field :user_id, value: @user.id %> 4 <%= f.submit 'Follow', class: 'btn btn-primary' %> 5<% end %>

ruby

1app/views/end_user/users/_unfollow.html.erb 2<%= form_with url: end_user_relation_path, method: :delete, remote: true do |f| %> 3 <%= f.hidden_field :user_id, value: @user.id %> 4 <%= f.submit 'Unfollow', class: 'btn btn-danger' %> 5<% end %> 6

ruby

1app/views/end_user/users/_showtemplate.html.erb 2<% if @user.id != current_user.id %> 3 <div class="follow-button"> 4 <%= render 'follow_button' %> 5 </div> 6<% end %> 7

ruby

1app/views/end_user/users/_follow_button.html.erb 2 3<% unless current_user == @user %> 4 <div id="follow_form"> 5 <% if current_user.following?(@user) %> 6 <%= render 'unfollow'%> 7 <% else %> 8 <%= render 'follow' %> 9 <% end %> 10 </div> 11<% end %> 12

javascript

1app/views/end_user/relations/create.js.erb 2 3$("#follow_form").html("<%= escape_javascript(render("users/unfollow")) %>");

javascript

1app/views/end_user/relations/destroy.js.erb 2 3$("#follow_form").html("<%= escape_javascript(render("users/follow")) %>");

試したこと

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

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

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

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

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

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

guest

回答3

0

自己解決

無事解決できました。
僕はもともとusers/follow_buttonでusers/followとusers/unfollowをレンダリングしていたのですが、それをやめてusers/follow_buttonのファイルにまとめました。
多分流れとしてはフォローするとcreateアクションが実行されて、フォーマットで同じアクション名のjsファイルを実行しているのだと思います。このファイルでusers/follow_buttonをレンダリングしろということだと思います。
しかし、アクションを実行しないとデータベースにも見た目にも反映されないはずですが、これはjson形式でデータを送受信しているのか、それともjavascript形式で送受信しているのかがわかんないです。そして、なんでjsファイルでusers/followとusers/unfollowをレンダリングするという記述をすると見た目に変化がないのかが全くわかりません。
コメントください。変更したファイルだけ下にまとめます。

app/views/end_user/users/_follow_button.html.erb <% unless current_user == @user %> <div id="follow_form"> <% if current_user.following?(@user) %> <%= form_with url: end_user_relation_path, method: :delete, remote: true do |f| %> <%= f.hidden_field :user_id, value: @user.id %> <%= f.submit 'Unfollow', class: 'btn btn-danger' %> <% end %> <% else %> <%= form_with url: end_user_relation_path, remote: true do |f| %> <%= f.hidden_field :user_id, value: @user.id %> <%= f.submit 'Follow', class: 'btn btn-primary' %> <% end %> <% end %> </div> <% end %>
app/views/end_user/relations/create.js.erb $("#follow_form").html("<%= escape_javascript(render("end_user/users/follow_button")) %>");
app/views/end_user/relations/destroy.js.erb $("#follow_form").html("<%= escape_javascript(render("end_user/users/follow_button")) %>");

これ以外のファイルは変更していません。答えてくれた皆様、ありがとうございました!

投稿2020/01/12 04:37

ryousukesatou

総合スコア19

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

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

ryousukesatou

2020/01/12 13:31

一個めの疑問は解消しました。ただ2個めがわかりません。他のサイトではusers/_followとusers/_unfollowに分けていて、実際はこの2つのファイルをusers/_follow_buttonにまとめてうまくいったのですが、なんで他のサイトに書いていた分けたやり方だとうまくいかないのでしょうか?
guest

0

railsでフォロー機能を非同期で実装しようとしているのですが、データはしっかり動いて、フォロー、アンフォローはできているのですが、見た目に変化がないんです。

フォローしたときに、DBでは反映されているがViewで反映されていない場合、View・JSに問題がありそうです。

フォローボタンを押して、再度ページ読み込みしたら、アンフォローボタンが出てくるのではないでしょうか?
もしそうなら問題は、Rubyで条件分岐しているからだと思います。

app/views/end_user/users/_follow_button.html.erb <% unless current_user == @user %> <div id="follow_form"> <% if current_user.following?(@user) %> <%= render 'unfollow'%> <% else %> <%= render 'unfollow'%> <% end %> </div> <% end %>

見当違いだったらすいません。。

投稿2020/01/11 06:26

no1knows

総合スコア3365

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

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

ryousukesatou

2020/01/11 06:53

合っています!ではどうすればいいのでしょうか?rubyで条件分岐をしていますが、rubyの記述を変えるのでしょうか?
no1knows

2020/01/11 07:19

僕は最初ajaxを利用した形を想定していましたが‥ざっと調べた限り、下記が簡単そうでした。 (いいねボタンですが、コメント欄も含めて確認ください。) https://qiita.com/YuitoSato/items/94913d6a349a530b2ea2 検索キーワードは、「rails フォロー機能 動的(またはjavascriptまたはajax)」とかで探してください。 そもそものお話ですが、Rubyはサーバーサイドスクリプトと言われ、サーバー側で処理した結果がブラウザに送信・表示されます。 それに比べてJavaScript(jQuery)などは、ブラウザだけで動的な表現ができます。 ここで言うJavaScriptの動的な表現とは、フォローボタンを押したら、すぐにアンフォローボタンが表示されるようなことを指します。 それに比べRubyは、サーバーサイドでしかデータを更新できないため、再度読み込みすると更新されると行った形になります。 https://www.kagoya.jp/howto/webhomepage/javascript/
ryousukesatou

2020/01/11 08:45

返信ありがとうございます。ちょっとやってみます。
guest

0

1の方はエラーではありません。

2ですが users/_follow.html.* がないというエラーです。
提示されているviewがみな ruby になっていてどのfileかわからないです。。。

で、
もしかしたら
app/views/end_user/users/_follow_button.html.erb
がそのつもりですか?
これは users/_button.html.* ではないですね。

投稿2020/01/10 14:04

winterboum

総合スコア23329

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

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

ryousukesatou

2020/01/11 05:19

回答ありがとうございます。ファイルの記述は使った言語の真下に書きたしました。follow_button.htmlでfollow.htmlとunfollowをレンダリングしています。そして、follow_button.htmlをshowtemplate.htmlをレンダリングしています。そのshowtemplateを他のファイルでレンダリングしているようにしてます。
winterboum

2020/01/11 08:44

そうしますと、destroy.js.erb の render("users/follow") が間違いでrender("users/follow_button") であるべき なのか /_follow_button.html.erb のfile名がまちがいで/_follow.html.erb で有るべきなのか、 のどちらかでは?
ryousukesatou

2020/01/11 12:35

はい、そんな感じでできました! この機能の実装でわかんないのがそこなのですが、他のサイトではjsファイルで ("<%= escape_javascript(render("end_user/users/follow")) %>");などと記述していたのですが、なぜそれでは動かず今回のように、 ("<%= escape_javascript(render("end_user/users/follow_button")) %>");にすると動いたのでしょうか?
winterboum

2020/01/11 12:50

render で呼ぶ名前とviewのfile名を一致させる必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問