railsでajaxを用いて自動更新を実装しようとしていましてなんとかローカルサーバーで無事繋がり自動更新自体はされているのですが、データがうまく送れていないのかこの「ActionController::RoutingError (No route matches [GET] "/groups/41/[object"):」
が出てしまいます。どこを修正もしくは加えたら直りますか。
Ruby
1class Api::MessagesController < ApplicationController 2 def index 3 group = Group.find(params[:group_id]) 4 last_message_id = params[:id].to_i 5 @messages = group.messages.includes(:user).where("id > #{last_message_id}") 6 end 7end
jquery
1$(function() { 2 3 function buildHTML(message) { 4 var image = message.image? `<img src= ${ message.image }>` : ""; 5 var html = `<div class="message" data-message="${message.id}"> 6 <div class="upper-message"> 7 <div class="upper-message__user-name"> 8 ${message.user_name} 9 </div> 10 <div class="upper-message__date"> 11 ${message.date} 12 </div> 13 </div> 14 <div class="lower-message"> 15 <p class="lower-message__content"> 16 ${message.content} 17 </p> 18 ${image} 19 </div>` 20 return html; 21 } 22 $('#new_message').on ('submit', function(e){ 23 e.preventDefault(); 24 var formData = new FormData(this); 25 var url = $(this).attr('action') 26 27 $.ajax({ 28 url: url, 29 type: "POST", 30 data: formData, 31 dataType: 'json', 32 processData: false, 33 contentType: false 34 }) 35 36 .done(function(data) { 37 var html = buildHTML(data); 38 $('.messages').append(html); 39 $('#new_message')[0].reset(); 40 $('.messages').animate({ scrollTop: $('.messages')[0].scrollHeight}); 41 }) 42 43 .fail(function(data) { 44 alert('メッセージを入力してください') 45 }) 46 47 .always(function(data) { 48 $('.form__submit').prop('disabled', false); 49 }) 50 }); 51 52 var reloadMessages = function() { 53 if (window.location.href.match(//groups/\d+/messages/)){ 54 var last_message_id = $('.message:last').data("message-id") 55 $.ajax({ 56 url: 'api/messages', 57 type: 'get', 58 dataType: 'json', 59 data: {id: last_message_id} 60 }) 61 .done(function(messages) { 62 var insertHTML = ''; 63 messages.forEach(function(message){ 64 insertHTML = buildHTML(message); 65 $('.messages').append(insertHTML); 66 $('.messages').animate({ scrollTop: $('.messages')[0].scrollHeight}); 67 }) 68 }) 69 .fail(function() { 70 alert('自動更新に失敗しました!'); 71 }); 72 } 73 }; 74 setInterval(reloadMessages, 5000); 75});
jbuilder
1json.array! @messages do |message| 2 json.content message.content 3 json.image message.image 4 json.created_at message.created_at 5 json.user_name message.user.name 6 json.id message.id 7end
haml
1.message{"data-message-id": "#{message.id}"} 2 .upper-message 3 .upper-message__user-name 4 = message.user.name 5 .upper-message__date 6 = message.created_at.strftime("%Y/%m/%d %H:%M") 7 .lower-message 8 - if message.content.present? 9 .lower-message__content 10 = message.content 11 = image_tag message.image.url, class: 'lower-message__image' if message.image.present?
Ruby
1Rails.application.routes.draw do 2 devise_for :users 3 root 'groups#index' 4 resources :users, only: [:index,:edit, :update] 5 resources :groups, only: [:new, :create, :edit, :update] do 6 resources :messages, only: [:index, :create] 7 namespace :api do 8 resources :messages, only: :index, defaults: { format: 'json' } 9 end 10 end 11end
追記
[1]こちらのコードを突っつかれますと、、
haml
1.message{"data-message-id": "#{message.id}"}
[2]同じgroup.idの場合のみここの処理がされ、、、
jquery
1var reloadMessages = function() { 2 if (window.location.href.match(//groups/\d+/messages/)){ 3 var last_message_id = $('.message:last').data("message-id") 4 $.ajax({ 5 url: 'api/messages', 6 type: 'get', 7 dataType: 'json', 8 data: {id: last_message_id} 9 }) 10 .done(function(messages) { 11 var insertHTML = ''; 12 messages.forEach(function(message){ 13 insertHTML = buildHTML(message); 14 $('.messages').append(insertHTML); 15 $('.messages').animate({ scrollTop: $('.messages')[0].scrollHeight}); 16 }) 17 }) 18 .fail(function() { 19 alert('自動更新に失敗しました!'); 20 }); 21 } 22 }; 23 setInterval(reloadMessages, 5000); 24});
[3]このapi/index.controller.rbが始まります。
Rails
1class Api::MessagesController < ApplicationController 2 def index 3 group = Group.find(params[:group_id]) 4 last_message_id = params[:id].to_i 5 @messages = group.messages.includes(:user).where("id > #{last_message_id}") 6 end 7end
[#]こちらがconfig/routes.rbになります。
Rails.application.routes.draw do devise_for :users root 'groups#index' resources :users, only: [:index,:edit, :update] resources :groups, only: [:new, :create, :edit, :update] do resources :messages, only: [:index, :create] namespace :api do resources :messages, only: :index, defaults: { format: 'json' } end end end
回答1件
あなたの回答
tips
プレビュー