Ruby Rails - неопределенная локальная переменная или метод current_user, использующий канал stream_from - PullRequest
0 голосов
/ 24 января 2019

Я хочу создать систему обмена сообщениями в реальном времени, но мне кажется, что я продолжаю получать

Could not execute command from ({"command"=>"subscribe", "identifier"=>"{\"channel\":\"Private::ConversationChannel\"}"}) [NameError - undefined local variable or method `current_user' for #<Private::ConversationChannel:0x00007f01c29a6788>]: /var/www/appror/app/channels/private/conversation_channel.rb:3:in `subscribed' | /home/work/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actioncable-5.2.2/lib/action_cable/channel/base.rb:179:in `block in subscribe_to_channel' | /home/work/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/callbacks.rb:109:in `block in run_callbacks' | /home/work/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/execution_wrapper.rb:83:in `wrap' | /home/work/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actioncable-5.2.2/lib/action_cable/engine.rb:68:in `block (3 levels) in <class:Engine>'

Приложение работает на

Rails version             5.2.2;
Ruby version              2.5.3-p105 (x86_64-linux);
RubyGems version          2.7.6;
Rack version              2.0.6

и я использую устройство для управления пользователями

/app/channels/private/conversation_channel.rb

class Private::ConversationChannel < ApplicationCable::Channel
    def subscribed
        stream_from "private_conversations_#{current_user.id}"      
    end
....



/app/jobs/private/message_broadcast_job.rb

class Private::MessageBroadcastJob < ApplicationJob
    queue_as :default

    def perform(message, previous_message)
        sender = message.user
        recipient = message.conversation.opposed_user(sender)

        broadcast_to_sender(sender, recipient, message, previous_message)
        broadcast_to_recipient(sender, recipient, message, previous_message)
  end

  private

  def broadcast_to_sender(sender, recipient, message, previous_message)
ActionCable.server.broadcast(
      "private_conversations_#{sender.id}",
      message: render_message(message, previous_message, sender),
      conversation_id: message.conversation_id,
      recipient_info: recipient
    )
  end

  def broadcast_to_recipient(sender, recipient, message, previous_message)
    ActionCable.server.broadcast(
      "private_conversations_#{recipient.id}",
      recipient: true,
      sender_info: sender,
      message: render_message(message, previous_message, recipient),
      conversation_id: message.conversation_id
    )
  end

  def render_message(message, previous_message, user)
    ApplicationController.render(
      partial: 'private/messages/message',
      locals: { message: message, 
            previous_message: previous_message, 
            user: user }
    )
  end
end

После входа в учетную запись пользователя я получаю

Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: upgrade, HTTP_UPGRADE: websocket)
Could not execute command from ({"command"=>"subscribe", "identifier"=>"{\"channel\":\"Private::ConversationChannel\"}"}) [NameError - undefined local variable or method `current_user' for #<Private::ConversationChannel:0x00007f01c2b4a198>]: /var/www/appror/app/channels/private/conversation_channel.rb:3:in `subscribed' | /home/work/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actioncable-5.2.2/lib/action_cable/channel/base.rb:179:in `block in subscribe_to_channel' | /home/work/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/callbacks.rb:109:in `block in run_callbacks' | /home/work/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/execution_wrapper.rb:83:in `wrap' | /home/work/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actioncable-5.2.2/lib/action_cable/engine.rb:68:in `block (3 levels) in <class:Engine>'

и, конечно, если я отправляю сообщение, новое сообщение не отображается в чате (скорее всего, из-за ошибки, связанной с подпиской)

Есть идеи?

Спасибо!

Edit:

/app/channels/application_cable/connection.rb

module ApplicationCable
    class Connection < ActionCable::Connection::Base
        identified_by :current_user

        def connect
            self.current_user = find_verified_user
        end

        protected

        def find_verified_user
            if (current_user = env['warden'].user)
                current_user
            else
                reject_unauthorized_connection
            end
        end
    end
end

Отсутствует identified_by :current_user Я добавил его, и больше не вижу этой ошибки.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...