带有子域的 Rails 应用程序中的操作电缆 - 公寓 gem 不工作

问题描述

Rails 5apartment gem

动作电缆connection.rb

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

    def connect
      self.tenant = request.subdomain
      Apartment::Tenant.switch!(tenant)

      self.current_user = find_verified_user
      logger.add_tags 'ActionCable',current_user.try(:email) || 'Unauthenticated User'
    end

    protected

    def find_verified_user # this checks whether a user is authenticated with devise
      if verified_user = env['warden'].user
        verified_user
      else
        # May have public users accessing the channels
        # reject_unauthorized_connection
      end
    end
  end
end

环境/生产.rb

config.action_cable.allowed_request_origins = [ /https:\/\/(.*).mydomain.com/ ]

尝试了从以下链接获取的上述代码参考:Link 1Link 2 但不起作用。

在生产中:request.subdomainnil(尝试对一些租户值进行热编码,但不起作用)

开发中:request.subdomain 提供租户名称,但实际请求无效。

有什么帮助吗?

解决方法

修复了这个问题:

request.subdomain 不起作用并返回“”。或者我通过查询字符串传递租户值

const getWebSocketURL = () => {
    var protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';
    var host = window.location.host;
    var path = '/cable';
    var url = protocol + host + path;
    return `${url}?tenant=mytenant`;
};

const wsUrl = getWebSocketURL();
const cable = ActionCable.createConsumer(wsUrl);

connection.rb:

self.tenant = request.params[:tenant]

也在你的频道中,你第一行应该使用的每种方法

Apartment::Tenant.switch!(tenant)

在这里您可以从房间获取租户值

也可以查看这些链接: how-to-set-tenant-in-actioncable
rails-actioncable-request-origins-subdomain

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...