首页 > 解决方案 > 无法使用 Action Cable 发送消息

问题描述

我正在使用 Action Cable 以异步传输的方式发送消息,但无法从房间的视图文件中发送,并且浏览器上没有错误消息。当我从聊天室发送消息时,终端上出现错误消息。

Finished "/cable/" [WebSocket] for ::1 at 2020-08-27 23:30:12 +0900
RoomChannel stopped streaming from room_channel
Started GET "/cable" for ::1 at 2020-08-27 23:30:12 +0900
Started GET "/cable/" [WebSocket] for ::1 at 2020-08-27 23:30:12 +0900
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
RoomChannel is transmitting the subscription confirmation
RoomChannel is streaming from room_channel
Started POST "/rooms/room_id/messages" for ::1 at 2020-08-27 23:30:15 +0900
Processing by MessagesController#create as JS
  Parameters: {"authenticity_token"=>"5W8w2TodPq5J2MlGRKyV7ITyn8OOnGcFoPVlAcwCAW6eTn6YRoHSioz91ZjjEL1AJpHJJsXv9+N9Cyr3jVoOqA==", "message"=>{"content"=>"test"}, "commit"=>"SEND", "room_id"=>"room_id"}
  User Load (0.5ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1
  Room Load (0.2ms)  SELECT `rooms`.* FROM `rooms` WHERE `rooms`.`id` = NULL LIMIT 1
  ↳ app/controllers/messages_controller.rb:14:in `create'
Completed 404 Not Found in 29ms (ActiveRecord: 19.5ms | Allocations: 5261)


  
ActiveRecord::RecordNotFound (Couldn't find Room with 'id'=room_id):
  
app/controllers/messages_controller.rb:14:in `create'

消息控制器

  def new
  end

  def create
    @room = Room.find(params[:room_id])
    @message = @room.messages.create!(message_params)
    ActionCable.server.broadcast 'room_channel', message: @message.content
  end

  private
  def message_params
    params.require(:message).permit(:content).merge(user_id: current_user.id, room_id: params[:room_id])
  end
end

路线

  resources :rooms, only: [:index, :show, :new, :create] do
    resources :messages, only: [:create] 
  end

消息模型

class CreateMessages < ActiveRecord::Migration[6.0]
  def change
    create_table :messages do |t|
      t.references :user, foreign_key: true
      t.references :room, foreign_key: true
      t.text :content, null: false
      t.timestamps
    end
  end
end

当我在消息控制器的创建操作下使用 binding.pry 时的消息。

[1] pry(#<MessagesController>)> params
=> <ActionController::Parameters {"authenticity_token"=>"2uBI7F1oAETeFwylWL10UFKmyfIwhBlQNsO7jznRMKuhwQatIfTsYBsyEHv/AVz88MWfF3v3ibbrPfR5eIk/bQ==", "message"=>{"content"=>"test"}, "commit"=>"SEND", "controller"=>"messages", "action"=>"create", "room_id"=>"room_id"} permitted: false>
[2] pry(#<MessagesController>)> 

显示.html.erb

<%= render "shared/header" %>


  <div id="message-container">
    <%= render 'shared/message' %>
  </div>

  <%= render 'shared/chat_footer' %>

    <div class="top_page_link">
      <%= link_to "Back to TOP", "/" %>
    </div>
</body>


<%= render "shared/footer" %>

_message.html.erb

<div id="message-container">
  <div class="messages" id="message-<%= @message.id %>"></div>

  <div class="messages_wrap">
    <div class="user_name_wrapper"> 
      <div class="chat_user_name"><%= @message.user.nickname %></div>
    </div>
    <div class="chat_message_wrapper">
      <div class="chat_messages"><%= simple_format @message.content %></div>
    </div>
  </div>
</div>

_chat_footer.html.erb

<footer class="fixed-bottom" id="footer">
  <%= form_with(model:[@room, @message], url:room_messages_path(:room_id), method: :post,) do |f| %>
    <div class="message_form-group">
      <%= f.text_area :content, class: 'form-control' %>
    </div>

    <div class="message_form-group">
      <%= f.submit '送信', class: 'send_btn', id: 'message-button' %>
    </div>
  <% end %>
</footer>


当我在浏览器上从 _chat_footer.html.erb 中取出 (:room_id) 时的错误消息。

ActionController::UrlGenerationError in Rooms#show
Showing /Users/ammy/projects/cutie_pies/app/views/shared/_chat_footer.html.erb where line #2 raised:

No route matches {:action=>"create", :controller=>"messages", :id=>"11"}, missing required keys: [:room_id]
Extracted source (around line #2):
1
2
3
4
5
6
              
<footer class="fixed-bottom" id="footer">
  <%= form_with(model:[@room, @message], url:room_messages_path, method: :post,) do |f| %>
    <div class="message_form-group">
      <%= f.text_area :content, class: 'form-control' %>
    </div>


Trace of template inclusion: #<ActionView::Template app/views/rooms/show.html.erb locals=[]>

Rails.root: /Users/ayumiuchimura/projects/cutie_pies

Application Trace | Framework Trace | Full Trace
app/views/shared/_chat_footer.html.erb:2
app/views/rooms/show.html.erb:8
Request

请有人帮助我..

标签: ruby-on-railsrubyajax

解决方案


推荐阅读