2017-03-02 52 views
0

我在軌道應用程序即時通訊工作中有聊天功能。我使用Ajax發送消息。我決定增加回形針到我的信息表,所以你可以在聊天中發送圖像,但是當我按下輸入圖像出現了一秒鐘,它存儲到數據庫,然後在頁面拋出一​​個錯誤Rails ajax聊天應用程序缺少此請求格式和變體的模板

MessagesController#create is missing a template for this request format and variant. request.formats: ["text/html"] request.variant: [] 

當我刷新頁面時,圖像在聊天中顯示得很好,所以我知道提交的表單。

chatrooms.cofee

$(document).on "turbolinks:load", -> 
    $("#new_message").on "keypress", (e) -> 
     if e && e.keyCode == 13 
     e.preventDefault() 
     $(this).submit() 

messages_controller.rb

class MessagesController < ApplicationController 
    before_action :authenticate_user! 
    before_action :set_chatroom 


    def create 
     message = @chatroom.messages.new(message_params) 
     message.user = current_user 
     message.save 
     MessageRelayJob.perform_later(message) 
    end 

    private 

    def set_chatroom 
    @chatroom = Chatroom.find(params[:chatroom_id]) 
    end 

    def message_params 
     params.require(:message).permit(:body, :image) 
    end 
end 

show.html.erb

<%= render 'side_nav' %> 

    <div class = "container-fluid"> 
    <div class = "col-sm-10 col-sm-offset-2"> 
    <p> 
     <strong>Name:</strong> 
     <%= @chatroom.name %> 
    </p> 

    <div data-behavior="messages" data-chatroom-id='<%= @chatroom.id %>'> 
    <% @messages.each do |message| %> 
    <%= render message %> 
    <% end %> 
    </div> 

     <%= form_for [@chatroom, Message.new], remote: true , multipart: true, authenticity_token: true do |f| %> 
     <%= f.text_field :body , rows: 1 , class: "form-control", autofocus:true%> 
     <%= f.file_field :image %> 
    <% end %> 

    </div> 

遺憾的壞格式,即時通訊新的堆棧溢出,但你可以添加儘可能多的聊天室,並且即時通過ajax發送消息。林不知道,如果我需要包括一些額外的代碼來處理圖像。發送基本字符串時沒有錯誤,只是回形針圖像。

+1

so ...你有一個'create.html.erb'嗎?因爲這就是Rails告訴你的,它期望的...... 另外 - 你可以在創建動作結束時重定向到顯示頁面:) –

+0

@Tarn East不,我在show.html.erb中呈現了表單,但我有一個只有這一行$(「#new_message」)[0] .reset()的create.js.erb。你是說做一個redirect_to節目嗎?我不想被重定向出聊天 – jalen201

+1

你得到的錯誤是說它缺少格式爲html的create-template。如果渲染不是你想要的......那麼你需要改變你如何調用創建動作。例如,如果你想要它要求的JS版本......那麼你需要確保'format:js'進入鏈接/表單請求。 :) –

回答

1

你得到的錯誤是說它缺少格式爲html的create-template。所以......你有create.html.erb? 因爲這就是Rails告訴你的期望...

如果渲染不是你想要的......那麼你需要改變你如何調用創建動作。例如,如果您希望它要求獲得create.js.erb模板的JS版本......那麼您需要確保format: js進入鏈接/表單請求。

另外 - 你可以重定向到創建操作結束時的顯示頁面:)

2

默認情況下,您的創建動作將會渲染。由於您沒有模板,也不想渲染,所以需要覆蓋它。

相反的:

def create 
    message = @chatroom.messages.new(message_params) 
    message.user = current_user 
    message.save 
    MessageRelayJob.perform_later(message) 
end 

做這樣的事情:

def create 
    message = @chatroom.messages.new(message_params) 
    message.user = current_user 
    if message.save 
    MessageRelayJob.perform_later(message) 
    render json: {success: "message sent", error: false}, status: 200 
    else 
    render json: {success: false, error: true}, status: 422 
    end 
end 

最終你的瀏覽器客戶端將需要一些反饋,是否被保存在消息/發送。

+0

我試過你的答案,並且錯誤確實消失了,但是我被重定向到顯示JSON響應的新頁面。有什麼方法可以留在聊天頁面上,因爲它是一個聊天功能@Blair Anderson – jalen201

+0

將'remote:true'更改爲'data:{remote:true}'您的表格 –

+0

@ jalen201您可以將我的答案標記爲正確? –