ruby-on-rails - 无法使用 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
请有人帮助我..
解决方案
推荐阅读
- r - 每行更新 dplyr 过滤器
- graphql - Apollo Graphql 界面 - 从查询创建可共享的 URL
- java - 使用 try catch 强制类之间的通信
- c - 为什么我的子进程中的 getline 会阻塞?
- java - 将 guice 创建的对象注入其他对象
- c++ - QTreeWidget MouseMove event is not called
- amazon-web-services - 具有相同内联策略的 AWS SAM 多项功能
- javascript - 从 nuxt.js 向 laravel 请求错误 419 未知状态
- javascript - 如何在moment.js中获得两个小时之间的差异?
- python - Django 将图像路径保存到数据库