Rails ActionCable&谐音

时间:2018-01-03 12:18:20

标签: ruby-on-rails ruby ruby-on-rails-5 actioncable

操作电缆配置为正确订阅,广播等

但是,由于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的{​​{1}}方法中,这是用户创建新邮件时调用的方法。问题是,创建消息时,MessagesChannel是创建消息的用户。这将为此用户单独呈现正确的HTML。该频道的其他用户/订阅者将播放相同的HTML ...这将导致第一个屏幕截图中出现错误。

current_user

该错误在

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.erb 将始终返回true,并且即使其他用户(订阅此频道的用户)也会在右侧显示头像。

另一件事是,我不想触摸局部中的行为,因为对于发送消息的用户,从if current_user.id == message.user_id发回的html是正确的(它在右边呈现化身。)

以下是两个用于说明

的屏幕截图

其他订阅者屏幕显示不正确。

enter image description here

正确显示邮件发件人屏幕。

enter image description here

任何人都知道我仍然可以使用此MessagesChannel部分的解决方法吗?谢谢!

3 个答案:

答案 0 :(得分:1)

嘿, 您的部分内容会在广播之前进行渲染。 broadcast_to方法发送一个字符串,该字符串是部分字符串的呈现的html。结果,当您呈现部分内容时,current_user是发送消息的人,因此,它以发送方查看部分内容的方式呈现。 一种解决方案是将布尔变量“ sender”传递给您的部分变量,即

<% 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 }

data [:htmlReceiver] = ApplicationController.render部分:“对话/消息”,本地:{消息:消息,发送者:false,} 数据[:senderId] = current_user.id.to_s

然后,您在Received(data)回调中设置条件,在其中将数据对象中的senderId与current_user ID进行比较,并插入data.htmlSender或data.htmlReceiver。

答案 1 :(得分:0)

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

=替换为==

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

答案 2 :(得分:0)

current_user.id = message.user_id这是一项任务。如果阻止,控制流将始终进入。使用==应该是正确的。