###前提・実現したいこと
- 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 3・ 4・ 5・ 6 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 3・ 4・ 5・ 6 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を使用していなかったため、その当時に設定したとして動いたかは分かりません。
お手数をおかけしますが、ご回答よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。