动作电缆被正确配置为订阅、广播等。
但是,由于一个avatars,我在错误的方面得到了用户Rails partial呈现的行为。
# conversations/_message.html.erb
<% if current_user.id == message.user_id %>
<Display Avatar Right>
</Display Avatar Right>
<% else %>
<Display Avatar Left>
</Display Avatar Left>
<% end %>当消息属于当前用户时,化身需要在右边的上为,否则,则需要在左边的上为。
在我的create_message方法的MessagesChannel中,这是用户创建新消息时调用的方法。问题是,当创建消息时,current_user是创建消息的用户。这将为呈现正确的--这个用户单独使用。频道的其他用户/订阅者将被播放相同的HTML.这将导致在第一个屏幕截图中看到的错误。
def create_message(message_params)
message = Message.new context_type: 'Conversation'
message[:body] = message_params['data']['body']
message[:context_id] = message_params['data']['conversation_id']
message[:user_id] = message_params['data']['user_id']
data = {}
if message.save
data[:html] = ApplicationController.render partial: 'conversations/message', locals: { message: message, current_user: current_user }
else
p message.errors.full_messages.to_sentence
data[:html] = "Error: #{message.errors.full_messages.to_sentence}"
end
ActionCable.server.broadcast('room', data)
end窃听器,在
# conversations/_message.html.erbif current_user.id == message.user_id将始终返回true,而化身将显示在右边,甚至对于其他用户(订阅此频道的用户)也是如此。
另一件事是,我不想触及部分中的行为,因为对于向发送消息的用户来说,从MessagesChannel发送回来的html是正确的(它在右边呈现化身)。
这里有两个截图来说明
其他订阅服务器屏幕显示错误。

消息发送者屏幕正确显示。

有人知道我仍然可以使用这个_message部分的解决方法吗?谢谢!
发布于 2020-12-03 12:36:10
嘿,你的部分在被广播之前就被渲染了。broadcast_to方法发送一个字符串,该字符串是该部分的呈现html。因此,当您呈现部分时,current_user是发送消息的那个人,因此它被呈现为发件人看到该部分的方式。解决方案可以是将一个布尔变量“发件人”传递给您的部分,即
<% if sender %>
<Display Avatar Right>
</Display Avatar Right>
<% else %>
<Display Avatar Left>
</Display Avatar Left>
<% end %>
然后,在数据对象和发送者Id中同时发送发送方和接收方的部分信息。
data[:htmlSender] = ApplicationController.render partial: 'conversations/message', locals: { message: message, sender: true }数据:htmlReceiver= ApplicationController.render分部:‘会话/消息’,局部变量:{ message: message,发件人: false,} data:senderId = current_user.id.to_s
然后,在接收到的(数据)回调中设置一个条件,将数据对象中的senderId与current_user id进行比较,并插入data.htmlSender或data.htmlReceiver。
发布于 2018-01-03 12:43:07
你输入了<% if current_user.id = message.user_id %>。
将=替换为==。
=将返回message.user_id的值,这在您的情况下是真实的。
发布于 2018-01-03 12:45:49
current_user.id = message.user_id这是个作业。控制流将始终进入if块。使用==应该是正确的。
https://stackoverflow.com/questions/48077252
复制相似问题