【发布时间】:2017-05-27 23:51:05
【问题描述】:
所以我有这个用例,我在控制器(使用 ApplicationController.renderer)中呈现一条消息,然后将其广播给几个用户。广播也在同一控制器内部执行。这两个动作都是在对某个对象执行更新时触发的。
问题是,我需要访问渲染视图中的 current_user 对象,当然,我不能将当前用户作为局部变量渲染它,因为这样消息将与广播消息的用户一起发送而不是看到该视图的最终用户。
因此,在阅读了几篇博文和 Rails 文档后,我将使用 cookie 的身份验证设置为由 action cable 支持。
我的问题是:如何在渲染视图中访问最终用户的对象 (current_user)?
目前,我的连接类看起来像这样。但是,如何使用此变量 (logged_user) 呈现该视图?
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :logged_user
def connect
self.logged_user = User.find_by(id: cookies.signed[:user_id])
end
end
end
我的控制器如下所示:
(...)
def update
if @poll.update(poll_params)
broadcast_message(render_message(@poll), @poll.id, @poll.room.id)
(...)
end
end
def broadcast_message(poll = {}, poll_id, room_id)
ActionCable.server.broadcast 'room_channel', body: poll, id: poll_id, room_id: room_id
end
def render_message(poll).
if poll.show_at.to_time <= Time.now
ApplicationController.renderer.render(
partial: 'rooms/individual_student_view_poll',
locals: {
poll: poll,
room: @room
})
end
end
(....)
所以基本上,我的最终目标是在消息被广播给它之后访问logged_user对象。
谢谢
【问题讨论】:
-
我也遇到了同样的问题,你在此期间发现了吗?
-
你可以渲染一个返回一些 javascript 的部分,它会从客户端触发一个新的请求来获取任何需要渲染的东西,这样这个请求就会被设置为适当的上下文。但是,假设您有 100 个用户订阅了该频道,那么他们每个人都会触发一个请求来获取该新内容。
标签: ruby-on-rails ruby ruby-on-rails-5 actioncable