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

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

ただいまの
回答率

90.00%

Ajaxの非同期通信がリロードをしないと反映されない

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 109

haisai

score 3

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
rails  tutorialを参考にしながらインスタグラム風のアプリを作成しています。
フォロー機能の実装中ですが、フォローボタンをAjaxで非同期通信で実装したいのですが、リロードボタンを押さないと反映されません。

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

該当のソースコード

gem file

gem 'rails',                   '5.1.6'
gem 'bcrypt',                  '3.1.12'
gem 'faker',                   '1.7.3'
gem 'carrierwave',             '1.2.2'
gem 'mini_magick',             '4.7.0'
gem 'will_paginate',           '3.1.6'
gem 'bootstrap-will_paginate', '1.0.0'
gem 'bootstrap-sass',          '3.3.7'
gem 'puma',                    '3.9.1'
gem 'sass-rails',              '5.0.6'
gem 'uglifier',                '3.2.0'
gem 'coffee-rails',            '4.2.2'
gem 'jquery-rails',            '4.3.1'
#gem 'turbolinks',              '5.0.1'
#gem 'jquery-turbolinks'
gem 'jbuilder',                '2.7.0'
gem 'rails-i18n'
gem 'ffi',                     '1.11.1'    
application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= csrf_meta_tags %>
    <%= stylesheet_link_tag    'application', media: 'all',
                               'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application',
                               'data-turbolinks-track': 'reload' %>
   <%= render 'layouts/shim'%>
  </head>
  <body>
   <%= render 'layouts/header' %>
    <% flash.each do |message_type,message| %>
    <div class = "alert alert-<%= message_type %>"><%= message %></div>
  <%end%>
    </header>
    <div class="container">
      <%= yield %>
      <%= render 'layouts/footer'%>
    </div>
  </body>
</html>
application.js

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
// vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file. JavaScript code in this file should be added after the last require_* statement.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//

//= require jquery
//= require jquery_ujs
//= require_tree .
create.js.html

$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>");
$("#followers").html('<%= @user.followers.count %>');

destroy.js.html

$("#follow_form").html("<%= escape_javascript(render('users/follow')) %>");
$("#followers").html('<%= @user.followers.count %>');
relationships.controller.rb

class RelationshipsController < ApplicationController
    before_action :logged_in_user


    #フォローする
    def create
      @user = User.find(params[:followed_id])
      current_user.follow(@user)
      respond_to do |format|
        format.html{redirect_to @user}
        format.js
      end
    end

    #フォロー解除
    def destroy
      @user = Relationship.find(params[:id]).followed
      current_user.unfollow(@user)
      respond_to do |format|
        format.html{redirect_to @user}
        format.js
      end
    end
end

試したこと

検索している中で、turbolinksを消してbundleをやれば解消されるという記事をいくつか見て試しましたが、うまくいきません。

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

Rails 5.1.6

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

controllerなどで状態は保存ができているという理解でいいのでしょうか?

この情報だと、controllerで非同期できているけども、
htmlの処理が行われていないのではないかと思います。

ajaxで帰って来た値はjs.htmlで取得できていますか?
consoleとか使ってみてみてもいいかも。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/02 19:53

    console.logでjsファイルの読み込み方を調べてみましたが方法が分かりません。。
    <%= @user.followers.count %>をhtmlに書くとフォロワー数が出てきましたが、これで何が分かるのでしょうか?理解不足で申し訳ありません。。

    キャンセル

  • キャンセル

  • 2019/12/03 18:26

    調べていただきありがとうございます。
    参考にしてコードを見直してみます。ありがとうございます。

    キャンセル

0

ファイル名を create.js.html ではなく create.js.erb にしないと動かないと思いますがどうでしょうか。 (destroy も)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/03 18:27

    コメントありがとうございます。
    申し訳ございません、確認した所ファイルはerbファイルになっていました。。記載ミスです

    キャンセル

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる