2017-01-12 24 views
5

このような場合、私はコントローラ(ApplicationController.renderer)でメッセージをレンダリングし、その後いくつかのユーザにブロードキャストします。ブロードキャストも同じコントローラの内部で実行されます。これらのアクションは、特定のオブジェクトへの更新が実行されたときにトリガーされます。Rails 5、action cable、current_user

問題は、レンダリングされたビュー内のcurrent_userオブジェクトにアクセスする必要があります。もちろん、現行のユーザーをローカル変数としてレンダリングすることはできません。その理由は、メッセージがブロードキャストされたユーザーそのビューを表示するエンドユーザーではありません。

ブログ記事とRailsドキュメントを読んだあと、アクションケーブルでサポートされるようにCookieを使って認証を設定しました。

私の質問は、レンダリングされたビュー内で、エンドユーザーのオブジェクト(current_user)にどのようにアクセスできますか?

現在、私の接続クラスは次のようになっています。しかし、どのように私はこの変数(logged_user)でそのビューをレンダリングできますか?

(...) 

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オブジェクトにアクセスすることです:

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 

私のコントローラは、このようになります。このような

おかげ

+0

、あなたはその間にそれを把握んでした? – cseelus

答えて

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 %> 
+0

しかし、どうすればコントローラからvar logged_userにアクセスできますか? – cbk200

+0

assignを使用すると、{logged_user:...}は@logged_userになります。あなたのチャンネルはApplicationCable :: Channelを継承していますので、自分のチャンネルからself.logged_userにアクセスし、 "assigns"を使ってビューに送信することができます。 –

+0

はい、以前は私がチャンネルからではなくコントローラからレンダリングしています。私はチャンネルでそれをやりますか?はいの場合、render_messageメソッドがチャンネルに存在すると仮定して、コントローラ内でどのようにアクセスできますか? – cbk200

関連する問題