但是,由于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是正确的(它在右边呈现化身。)
任何人都知道我仍然可以使用此MessagesChannel
部分的解决方法吗?谢谢!
答案 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
这是一项任务。如果阻止,控制流将始终进入。使用==
应该是正确的。