【问题标题】:Rails ajax chat app missing a template for this request format and variantRails ajax 聊天应用缺少此请求格式和变体的模板
【发布时间】:2017-07-21 13:15:13
【问题描述】:

我正在开发的 Rails 应用程序中有一个聊天功能。我使用 ajax 发送消息。我决定在我的消息表中添加回形针,这样你就可以在聊天中发送图像,但是当我按下 Enter 时,图像会出现一秒钟,它会存储到数据库中,然后页面会抛出错误

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

【问题讨论】:

  • 所以...你有create.html.erb 吗?因为这是 Rails 告诉你它所期待的......或者 - 你可以在创建操作结束时重定向到显示页面:)
  • @Tarn East 没有,我在 show.html.erb 中渲染了表单,但我确实有一个 create.js.erb,只有这一行 $("#new_message")[0]。重置()。你是说做一个redirect_to show 吗?我不想被重定向到聊天之外
  • 您得到的错误是说它缺少格式为 html 的创建模板。如果渲染不是您想要的...那么您需要更改 调用 create 操作的方式。例如,如果您希望它要求 JS 版本...那么您需要确保 format: js 进入链接/表单请求。 :)
  • 实际上@Tarn East 你绝对正确我添加了 redirect_to "show" ,这解决了问题。不敢相信我没有感谢这一点。谢谢。
  • 我会把它变成一个答案:)

标签: ruby-on-rails ruby ajax coffeescript


【解决方案1】:

默认情况下,您的创建操作将呈现。由于您没有模板并且不希望它呈现您需要覆盖它。

代替:

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

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

【讨论】:

  • 我试过你的答案,错误确实消失了,谢谢,但我被重定向到显示 JSON 响应的新页面。有没有办法让我留在聊天页面上,因为这是@Blair Anderson 的聊天功能
  • 将表单上的 remote: true 更改为 data: {remote: true}
  • 您的表单使用 HTML 而不是 JSON 提交。您还可以更改您的咖啡脚本以通过 AJAX 提交,而不是使用 $(this).submit()
  • 更改控制器以重定向到“显示”似乎可以解决问题
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    在您的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多