Rails 5,动作电缆和current_user

时间:2017-01-12 18:35:41

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

所以我有这个用例,我在一个控制器(带有ApplicationController.renderer)中呈现一条消息,然后广播给几个用户。广播也在同一控制器内执行。执行对某个对象的更新时,将触发这两个操作。

问题是,我需要访问该渲染视图中的current_user对象,当然,我无法将当前用户渲染为本地变量,因为这样的消息将与广播消息的用户一起发送而不是将看到该视图的最终用户。

因此,在阅读了几篇博客文章和Rails文档之后,我通过动作电缆支持使用cookie设置身份验证。

我的问题是:我如何在渲染视图中访问最终用户的对象(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对象。

谢谢

1 个答案:

答案 0 :(得分:0)

这样的事情:

ApplicationController.renderer.render(
  partial: 'rooms/individual_student_view_poll',
  locals: {
    poll: poll,
    room: @room
  },
  assigns: {
    logged_user: logged_user
  }
)

将在您的模板中提供,如下所示:

<% if defined? @logged_user %>
...
<% end %>