2017-01-12 54 views
5

Tak mam ten przypadek użycia, w którym renderuję komunikat w kontrolerze (z ApplicationController.renderer), który jest następnie nadawany do kilku użytkowników. Transmisja odbywa się również w tym samym kontrolerze. Obie te akcje są wyzwalane, gdy wykonywana jest aktualizacja do określonego obiektu.Szyny 5, kabel akcji i current_user

Problem polega na tym, że muszę uzyskać dostęp do obiektu current_user wewnątrz renderowanego widoku i oczywiście nie mogę renderować go z bieżącym użytkownikiem jako zmienną lokalną, ponieważ wtedy wiadomość zostanie wysłana z użytkownikiem, który nadał wiadomość, a nie użytkownik końcowy, który zobaczy ten widok.

Po przeczytaniu kilku postów na blogu i dokumentów Railsowych ustawiam uwierzytelnianie za pomocą plików cookie, które będą obsługiwane przez kabel akcji.

Moje pytanie brzmi: w jaki sposób mogę uzyskać dostęp do wewnątrz renderowanego widoku obiektu (current_user) użytkownika końcowego?

Obecnie moja klasa połączeń wygląda następująco. Jak jednak renderować ten widok za pomocą tej zmiennej (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 

Mój kontroler wygląda następująco:

(...) 

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 

(....) 

Więc w zasadzie, mój ostatecznym celem jest, aby uzyskać dostęp do obiektu logged_user po wiadomość jest transmitowana do niego.

Dzięki

+0

Mam dokładnie ten sam problem, czy ustalić to w międzyczasie ? – cseelus

Odpowiedz

0

coś takiego:

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

będzie dostępny w szablonie tak:

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

OK, ale jak mogę uzyskać dostęp do var logged_user ze sterownika? – cbk200

+0

Używając przypisań, {logged_user: ...} staje się @logged_user. Twój kanał dziedziczy kanał ApplicationCable :: Channel, dzięki czemu możesz uzyskać dostęp do self.logged_user ze swojego kanału i przesłać go do widoku poprzez "przypisuje" –

+0

Tak, ale jak już powiedziałem, renderuję z kontrolera nie z kanału. czy powinienem to zrobić na kanale? Jeśli tak, i zakładając, że metoda render_message znajduje się w kanale, w jaki sposób mogę uzyskać do niej dostęp w kontrolerze? – cbk200