Rails ajax聊天应用程序缺少此请求格式和变体的模板

时间:2017-03-02 00:36:11

标签: ruby-on-rails ruby ajax coffeescript

我正在使用rails应用程序中的聊天功能。我用ajax发送消息。我决定将paperclip添加到我的消息表中,这样你就可以在聊天中发送图像,但是当我按下输入时,图像会显示一秒钟,它会存储到数据库中,然后页面会抛出错误

    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发送消息。我不确定我是否需要包含某种额外的代码来处理图像。发送基本字符串时只有回形针图像没有错误。

3 个答案:

答案 0 :(得分: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

最终,您的浏览器客户端需要一些关于消息是否已保存/发送的反馈。

答案 1 :(得分:1)

你得到的错误是它缺少一个格式为html的创建模板。所以...你有create.html.erb吗? 因为这就是Rails告诉你的预期......

如果渲染不是您想要的...那么您需要更改调用创建操作的方式。例如,如果您希望它要求create.js.erb模板的JS版本...那么您需要确保format: js进入链接/表单请求。

或者 - 您可以在创建操作结束时重定向到显示页面:)

答案 2 :(得分:0)

在您的MessagesController中,您需要以这种方式添加重定向。 “在最后一行redirect_to chatroom_path(@chatroom)中,您正确地重定向了”

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