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

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

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

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Ajax

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

Q&A

解決済

1回答

2828閲覧

rails4 ajax通信のcallbackが取得できません

teamsky

総合スコア8

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Ajax

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

0グッド

0クリップ

投稿2016/07/22 08:26

###前提・実現したいこと

  • Ruby 2.3.0
  • Rails 4.2.6
  • jquery-rails (4.1.1)
  • jquery-ui-rails (5.0.5)

ajax通信を用いてformにて投稿した際にcallbackのsuccessを取得したいです。

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

formからajax通信を行った際のcallbackが取得できません。
ajax通信自体は成功しており、画面を部分的に更新する事はできております。

###該当のソースコード

■ _comments.html.erb

ajaxにて部分的に更新されるviewです。
<div id="comment<%= wall.id %>" class="comment"> 」の部分が更新対象です。

html

1<% if wall.comments.length > 0 or current_user %> 2 <div id="wall-comments"> 3 <div id="comment<%= wall.id %>" class="comment"> 4 <!-- comment --> 5 <%= render :partial => "/shared/comments_detail", :locals => {:wall => wall } %> 6 <!-- comment --> 7 </div> 8 </div> 9<% end %>

■ _comments_detail.html.erb

formにてCommentsController#createにpostしています。
この際に「:remote => true」を設定しajax通信にしています。

html

1<%= form_for @comment, :html => { id: "new_comment_#{wall.id}", :class => 'form-ajax', :remote => true } do |f| %> 2 <div class="postbox"> 3 <div role="alert"></div> 4 <div class="avatar"> 5 <span class="user"> 6 <%= user_image_link(wall.user, "user-avatar") %> 7 </span> 8 </div> 9 10 <div class="textarea-wrapper no-border" data-role="textarea" dir="auto"> 11 <%= f.hidden_field :wall_id %> 12 <%= f.hidden_field :user_id %> 13 <%= f.text_area :body, :class => 'sm-form-control no-resize', :placeholder=> get_comment_placeholder, "data-wall-id" => wall.id %> 14 </div> 15 <% if request.smart_phone? or request.tablet? %> 16 <%= submit_tag "送信", class: "btn btn-primary btn-xs" %> 17 <% end %> 18 </div> 19<% end %>

■ comments_controller.rb

createのactionです。

ruby

1class CommentsController < ApplicationController 2 3 def create 4 5 # コメント登録 6 @comment = Comment.new(comment_params) 7 8 ActiveRecord::Base.transaction do 9 @comment.save! 10 end 11 12 # wall_idセット 13 @wall_id = @comment.wall_id 14 end 15 16 def comment_params 17 params.require(:comment).permit(:wall_id, :user_id, :body) 18 end 19end

■ create.js.erb

下記jsにて部分的に画面を更新しています。

javascript

1$("#comment<%= escape_javascript(@wall_id.to_s) %>").html( 2 "<%= escape_javascript(render :partial => '/shared/comments_detail') %>" 3);

■ comments.js

「form-ajax」のclassが設定されたformのcallbackを取得するように設定しています。

javascript

1$('.form-ajax').on("ajax:success", function(evt, data, status, xhr){ 2 alert("test"); 3});

###試したこと

ajax通信時のdataTypeにより取得できないという記事を見つけました。
http://stackoverflow.com/questions/16006784/rails-ajaxsuccess-callback-not-triggering-in-production

試しに「dataType: 'html'」にしたところcallbackは取得できるようになったのですが
逆に画面を部分的に更新する事ができなくなりました。
ただしこの状況でもrailsにはajax通信でアクセスしておりrenderはRendered comments/create.js.erbを返しています。

【パターン1】

■ application.js

dataTypeを'html'に変更
callbackは拾えるようになるのですが、画面が更新されなくなります。

javascript

1$(document).ready(function () { 2 $.ajaxSetup({ 3 dataType: 'html' 4 }); 5});

■ development.log

dataTypeを'html'に変更した際のログです「CommentsController#create as HTML」となっておりますが
renderdではcreate.js.erbを返しています。

bash

1Started POST "/comments" for 192.168.11.147 at 2016-07-22 16:41:24 +0900 2Processing by CommentsController#create as HTML 3456 Rendered shared/_comments_detail.html.erb (52.3ms) 7 Rendered comments/create.js.erb (62.0ms) 8Completed 200 OK in 140ms (Views: 68.2ms | ActiveRecord: 42.3ms)

【パターン2】

dataTypeを'script'に変更
画面が更新されるのですが、callbackが取得できなくなります。

■ application.js

javascript

1$(document).ready(function () { 2 $.ajaxSetup({ 3 dataType: 'script' 4 }); 5});

dataTypeを'script'に変更した際のログです「CommentsController#create as JS」となっており
renderdでcreate.js.erbを返しています。

bash

1Started POST "/ja/comments" for 192.168.8.22 at 2016-07-22 17:01:15 +0900 2Processing by CommentsController#create as JS 3456 Rendered shared/_comments_detail.html.erb (21.6ms) 7 Rendered comments/create.js.erb (23.9ms) 8Completed 200 OK in 108ms (Views: 26.9ms | ActiveRecord: 54.1ms)

補足情報

影響があるか分からないですが1ヶ月ほど前にrailsをバージョン3.2.11から4.2.6にアップグレードしています。
3.2.11の頃にはcallbackを使用していなかったため、その当時に設定したとして動いたかは分かりません。

お手数をおかけしますが、ご回答よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
(でも理由はわかっていません。どなたかご教授頂けると助かります。)

callbackの記述を変更したところ正常に動作するようになりました。

■ 変更前

javascript

1$('.form-ajax').on("ajax:success", function(evt, data, status, xhr){ 2 alert("test"); 3});

■ 変更後

javascript

1$(document).bind('ajaxSuccess', '.form-ajax', function(event, jqxhr, settings, exception){ 2 alert("test"); 3});
  1. 「ajax:success」を「ajaxSuccess」に変更
  2. 「$('.form-ajax').on」を「$(document).bind」に変更

ちなみに「$(document).on」では動作しませんでした。
また「$(document).bind('ajax:success'」でも動作しませんでした。
「$(document).bind('ajaxSuccess'」のみ正常に動作しました。

投稿2016/07/22 09:46

teamsky

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問