首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails ActionCable & Partials

Rails ActionCable & Partials
EN

Stack Overflow用户
提问于 2018-01-03 12:18:20
回答 3查看 660关注 0票数 0

动作电缆被正确配置为订阅、广播等。

但是,由于一个avatars,我在错误的方面得到了用户Rails partial呈现的行为。

代码语言:javascript
复制
# 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.这将导致在第一个屏幕截图中看到的错误。

代码语言:javascript
复制
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

窃听器,在

代码语言:javascript
复制
# conversations/_message.html.erb

if current_user.id == message.user_id将始终返回true,而化身将显示在右边,甚至对于其他用户(订阅此频道的用户)也是如此。

另一件事是,我不想触及部分中的行为,因为对于发送消息的用户来说,从MessagesChannel发送回来的html是正确的(它在右边呈现化身)。

这里有两个截图来说明

其他订阅服务器屏幕显示错误。

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

有人知道我仍然可以使用这个_message部分的解决方法吗?谢谢!

EN

回答 3

Stack Overflow用户

发布于 2020-12-03 12:36:10

嘿,你的部分在被广播之前就被渲染了。broadcast_to方法发送一个字符串,该字符串是该部分的呈现html。因此,当您呈现部分时,current_user是发送消息的那个人,因此它被呈现为发件人看到该部分的方式。解决方案可以是将一个布尔变量“发件人”传递给您的部分,即

代码语言:javascript
复制
<% if sender %> 
  <Display Avatar Right>
  </Display Avatar Right>
<% else %>
  <Display Avatar Left>
  </Display Avatar Left>
<% end %>

然后,在数据对象和发送者Id中同时发送发送方和接收方的部分信息。

代码语言:javascript
复制
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。

票数 1
EN

Stack Overflow用户

发布于 2018-01-03 12:43:07

你输入了<% if current_user.id = message.user_id %>

=替换为==

=将返回message.user_id的值,这在您的情况下是真实的。

票数 0
EN

Stack Overflow用户

发布于 2018-01-03 12:45:49

current_user.id = message.user_id这是个作业。控制流将始终进入if块。使用==应该是正确的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48077252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档