From 8b69f1eeba753c38364fb88136b2503480f2de1d Mon Sep 17 00:00:00 2001
From: Jon Moss <me@jonathanmoss.me>
Date: Thu, 4 Feb 2016 22:33:46 -0500
Subject: Enable Action Cable routes by default

This also marks Action Cable routes as internal to Rails.
---
 .../app/assets/javascripts/action_cable.coffee.erb        |  2 +-
 actioncable/lib/action_cable/engine.rb                    | 13 ++++++++++++-
 .../lib/action_cable/helpers/action_cable_helper.rb       | 15 +++++++++++++--
 actioncable/lib/action_cable/server/configuration.rb      |  2 +-
 4 files changed, 27 insertions(+), 5 deletions(-)

(limited to 'actioncable')

diff --git a/actioncable/app/assets/javascripts/action_cable.coffee.erb b/actioncable/app/assets/javascripts/action_cable.coffee.erb
index d95fe78ac5..6a8b4eeb85 100644
--- a/actioncable/app/assets/javascripts/action_cable.coffee.erb
+++ b/actioncable/app/assets/javascripts/action_cable.coffee.erb
@@ -9,7 +9,7 @@
 
   getConfig: (name) ->
     element = document.head.querySelector("meta[name='action-cable-#{name}']")
-    element?.getAttribute("content")
+    element?.getAttribute("content") ? '/cable'
 
   createWebSocketURL: (url) ->
     if url and not /^wss?:/i.test(url)
diff --git a/actioncable/lib/action_cable/engine.rb b/actioncable/lib/action_cable/engine.rb
index f5f1cb59e0..ae0c59dccd 100644
--- a/actioncable/lib/action_cable/engine.rb
+++ b/actioncable/lib/action_cable/engine.rb
@@ -6,7 +6,7 @@ require "active_support/core_ext/hash/indifferent_access"
 module ActionCable
   class Railtie < Rails::Engine # :nodoc:
     config.action_cable = ActiveSupport::OrderedOptions.new
-    config.action_cable.url = '/cable'
+    config.action_cable.mount_path = '/cable'
 
     config.eager_load_namespaces << ActionCable
 
@@ -40,5 +40,16 @@ module ActionCable
         options.each { |k,v| send("#{k}=", v) }
       end
     end
+
+    initializer "action_cable.routes" do
+      config.after_initialize do |app|
+        config = app.config
+        unless config.action_cable.mount_path.nil?
+          app.routes.prepend do
+            mount ActionCable.server => config.action_cable.mount_path, internal: true
+          end
+        end
+      end
+    end
   end
 end
diff --git a/actioncable/lib/action_cable/helpers/action_cable_helper.rb b/actioncable/lib/action_cable/helpers/action_cable_helper.rb
index 3067542b33..200732fdcd 100644
--- a/actioncable/lib/action_cable/helpers/action_cable_helper.rb
+++ b/actioncable/lib/action_cable/helpers/action_cable_helper.rb
@@ -20,9 +20,20 @@ module ActionCable
       # Make sure to specify the correct server location in each of your environments
       # config file:
       #
-      #   config.action_cable.url = "ws://example.com:28080"
+      #   config.action_cable.mount_path = "/cable123"
+      #   <%= action_cable_meta_tag %> would render:
+      #   => <meta name="action-cable-url" content="/cable123" />
+      #
+      #   config.action_cable.url = "ws://actioncable.com"
+      #   <%= action_cable_meta_tag %> would render:
+      #   => <meta name="action-cable-url" content="ws://actioncable.com" />
+      #
       def action_cable_meta_tag
-        tag "meta", name: "action-cable-url", content: Rails.application.config.action_cable.url
+        tag "meta", name: "action-cable-url", content: (
+          ActionCable.server.config.url ||
+          ActionCable.server.config.mount_path ||
+          raise("No Action Cable URL configured -- please configure this at config.action_cable.url")
+        )
       end
     end
   end
diff --git a/actioncable/lib/action_cable/server/configuration.rb b/actioncable/lib/action_cable/server/configuration.rb
index ee17bff13b..9a7301287c 100644
--- a/actioncable/lib/action_cable/server/configuration.rb
+++ b/actioncable/lib/action_cable/server/configuration.rb
@@ -6,7 +6,7 @@ module ActionCable
       attr_accessor :logger, :log_tags
       attr_accessor :connection_class, :worker_pool_size
       attr_accessor :disable_request_forgery_protection, :allowed_request_origins
-      attr_accessor :cable, :url
+      attr_accessor :cable, :url, :mount_path
 
       attr_accessor :channel_paths # :nodoc:
 
-- 
cgit v1.2.3