javascript - ActionCable 没有从 webhook/create 方法广播部分内容?
问题描述
我设置了 actioncable 来处理 Twilio api 响应。我遇到的问题是,当响应来自 webhook 控制器并且我无法呈现其中包含 rails 辅助方法的 html 对象时,actioncable 不起作用。如何让 actioncable 正确广播到消息显示操作。当响应既是本地的又是来自我的 webhook 创建操作时?
Rails 日志
Message Create (0.9ms) INSERT INTO "messages" ("conversation_id",....)
app/controllers/webhooks/twilio_controller.rb:10:in `create'
(10.5) COMMIT
app/controllers/webhooks/twilio_controller.rb:10in `create'
[ActionCable] Broadcasting to messages: {:html => "<div class=\"comment\">\n....
Completed 200 OK in 29ms
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION:...
MessageChannel is transmitting the subscription confirmation
MessageChannel is streaming from message_channel
动作电缆助手 / application_helper.rb
def render_message(message)
ApplicationController.render({partial: "messages/message",locals: {message: message}})
end
def send_cable(message)
html = render_message(message)
ActionCable.server.broadcast 'messages', html: html
end
消息控制器
class MessagesController < ApplicationController
include ApplicationHelper
def create
@messages = @conversation.messages.build(message_params)
if @message.save
send_cable(@message)
else
# it broke
end
end
end
对话/show.html.erb
//boiler plate divs
..
<div id="comments">
<%= render @conversation.messages %>
</div>
<%= render "messages/form", conversation: @conversation, message: Message.new %>
消息/create.js.erb
$('#comments').append("<%= j(render @message) %>").hide().fadeIn(2000);
$('#message_form')[0].reset();
message_channel.js
import consumer from "./consumer"
consumer.subscriptions.create("MessageChannel", {
connected() {
},
disconnected() {
},
received: function(data) {
$("#comments").append('<div class="comment">\n +
'<div class="avatar">\n' +
'<div class="ui label <%= data.outbound ? \'blue\' : \'green\' %> circle empty horizontal>.
</div>\n' +
....
').hide().fadeIn(2000);
$('#message_form')[0].reset();
}
});
message_channel.rb
class MessageChannel < ApplicationCable::Channel
def subscribed
stream_from 'message_channel'
end
def unsubscribed
#
end
end
twilio_controller.rb
class Webhooks::TwilioController < ApplicationController
skip_before_action :verify_authenticity_token
include ApplicationHelper
def create
provider = PersonalInfo.find_by(mobile_phone: params[:From])
body = params[:Body]
conversation = Conversation.find_or_create_by(personal_info: provider)
message = conversation.messages.create!(personal_info: provider, body: body)
send_cable(message) # Does not render new message when fired off
render json: {state: 200}
end
结尾
解决方案
推荐阅读
- netsuite - 无法使用 setCurrentSublistValue 更改子列表字段
- javascript - 如何将 vue-i18n 的 $t 函数注入 cy 对象(cypress 全局对象)
- reactjs - 如何获取下拉 React 的特定 ID?
- r - 多个人和多层次的变化点分析
- powershell - 在 PowerShell 中检查 Cosmos DB 帐户的状态
- react-native - React Native 图像裁剪选择器找不到合适的图像 URL 加载器 (null)
- paypal - 多个产品的 PayPal v2 入职错误
- python - Python中CSV文件的编码错误
- html - 我无法为浏览器加载@font-face
- flutter - 调用 api 时在 null 上调用了方法“[]”