Я хочу создать систему обмена сообщениями в реальном времени, но мне кажется, что я продолжаю получать
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
Я добавил его, и больше не вижу этой ошибки.
Спасибо!