このような場合、私はコントローラ(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
私のコントローラは、このようになります。このような
おかげ
、あなたはその間にそれを把握んでした? – cseelus