Ruby on rails helper\u方法不适用于ActionCable

Ruby on rails helper\u方法不适用于ActionCable,ruby-on-rails,actioncable,Ruby On Rails,Actioncable,我是RubyonRails新手,在过去的两个月里,我一直在努力理解ActionCable 我有一个助手方法:在中定义的当前用户 app/controllers/application_controller.rb class ApplicationController

我是RubyonRails新手,在过去的两个月里,我一直在努力理解ActionCable

我有一个助手方法:在中定义的当前用户

app/controllers/application_controller.rb

class ApplicationController
当你从

app/views/layouts/application.html.erb


例如,它显示:1。 但是,当我将:current_user带到Action Cable时,它会显示为空或零

app/channels/application\u cable/connection.rb

模块应用程序表
类连接
终端: 已成功升级到WebSocket(请求\方法:GET,HTTP\连接:升级,HTTP\升级:WebSocket) 出现异常-NoMethodError(nil:NilClass的未定义方法'id')


提前感谢您的帮助或指导

如果您看到您提供的文档,您将知道由标识的\u不是通道实例的方法。它是Actioncable::Connection的一种方法。根据Actioncable概述的Rails指南,以下是连接类的外观:

#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 

  private
  def find_verified_user 
   if current_user = User.find_by(id: cookies.signed[:user_id])
       current_user 
   else
       reject_unauthorized_connection 
   end 
  end
 end 
end
模块
ApplicationTable类连接
如您所见,当前用户在此处不可用。相反,您必须在连接中在此创建当前用户。
websocket服务器没有会话,但它可以读取与主应用相同的cookie。所以我想,你需要在认证后保存cookie。请尽快感谢。

您的应用程序控制器(或一般控制器)、帮助程序和ActionCable之间没有任何关系。它们是完全不同的概念

控制器响应常规HTTP请求。它们继承自
ActionController::Base
ActionController::Api
ActionController::Metal

帮助程序只是位于视图上下文中的
app/Helpers
目录中的模块。这是控制器提供视图的上下文。当您调用
helper\u method:current\u user
时,您也可以在控制器中使用该方法

但是ActionCable连接不是控制器。它与控制器或MVC也没有任何实际关系

连接是客户机-服务器关系的基础。对于 服务器接受的每个WebSocket都有一个连接对象 实例化

Websockets是与HTTP完全分离的协议

虽然您可以在连接类中包含您的助手,因为它们只是模块,但在这里,它们并不能帮助您。所以,你在一些教程中构建的基于会话的小身份验证不可能神奇地开始在ActionCable中工作


您仍然可以通过
cookies.signed
访问cookies,因此您需要修改您的身份验证系统,以便它设置一个签名的HTTP cookie,然后在ActionCable中读取该cookie。

帮助程序方法仅在您的视图中可用。记住这一点。

感谢大家的帮助和快速澄清@max