From 95e218c8acb8725989913b9b75043b6cfd47e963 Mon Sep 17 00:00:00 2001 From: Jared White Date: Fri, 4 Jun 2021 21:33:18 -0700 Subject: [PATCH 1/3] Support `to_dom_selector` for operation selectors --- lib/cable_ready/identifiable.rb | 10 ++++++++++ lib/cable_ready/operation_builder.rb | 2 +- test/lib/cable_ready/cable_car_test.rb | 11 +++++++++++ test/lib/cable_ready/identifiable_test.rb | 2 ++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/cable_ready/identifiable.rb b/lib/cable_ready/identifiable.rb index 110ffec5..c3c60704 100644 --- a/lib/cable_ready/identifiable.rb +++ b/lib/cable_ready/identifiable.rb @@ -15,5 +15,15 @@ def dom_id(record, prefix = nil) "##{id}".squeeze("#").strip end + + def determine_dom_selector(obj) + if obj.respond_to?(:to_dom_selector) + obj.to_dom_selector + elsif obj.is_a?(ActiveRecord::Base) || obj.is_a?(ActiveRecord::Relation) + dom_id(obj) + else + obj.to_s + end + end end end diff --git a/lib/cable_ready/operation_builder.rb b/lib/cable_ready/operation_builder.rb index d40f86c3..23221c14 100644 --- a/lib/cable_ready/operation_builder.rb +++ b/lib/cable_ready/operation_builder.rb @@ -32,7 +32,7 @@ def add_operation_method(name) options["selector"] = previous_selector if previous_selector && options.exclude?("selector") if options.include?("selector") @previous_selector = options["selector"] - options["selector"] = previous_selector.is_a?(ActiveRecord::Base) || previous_selector.is_a?(ActiveRecord::Relation) ? dom_id(previous_selector) : previous_selector + options["selector"] = determine_dom_selector(previous_selector) end @enqueued_operations[name.to_s] << options self diff --git a/test/lib/cable_ready/cable_car_test.rb b/test/lib/cable_ready/cable_car_test.rb index b008b632..b09e77eb 100644 --- a/test/lib/cable_ready/cable_car_test.rb +++ b/test/lib/cable_ready/cable_car_test.rb @@ -25,4 +25,15 @@ class CableReady::CableCarTest < ActiveSupport::TestCase CableReady::CableCar.instance.inner_html(selector: "#users", html: "winning").dispatch(clear: false) assert_equal({"inner_html" => [{"selector" => "#users", "html" => "winning"}]}, CableReady::CableCar.instance.instance_variable_get(:@enqueued_operations)) end + + test "selectors should accept any object which respond_to? to_dom_selector" do + CableReady::CableCar.instance.reset! + my_object = Struct.new(:id) do + def to_dom_selector + "##{id}" + end + end.new("users") + dispatch = CableReady::CableCar.instance.inner_html(selector: my_object, html: "winning").dispatch + assert_equal({"innerHtml" => [{"selector" => "#users", "html" => "winning"}]}, dispatch) + end end diff --git a/test/lib/cable_ready/identifiable_test.rb b/test/lib/cable_ready/identifiable_test.rb index 35efa1c4..0a8b6a4c 100644 --- a/test/lib/cable_ready/identifiable_test.rb +++ b/test/lib/cable_ready/identifiable_test.rb @@ -71,5 +71,7 @@ class CableReady::IdentifiableTest < ActiveSupport::TestCase assert_equal "#user_99", dom_id(user) assert_equal "#user_99", dom_id(user, nil) assert_equal "#all_active_user_99", dom_id(user, "all_active") + + assert_equal "#user_99", determine_dom_selector(user) end end From 1f905d37d5cdecf7b41a3c943a4943e647256e32 Mon Sep 17 00:00:00 2001 From: Jared White Date: Sun, 6 Jun 2021 20:11:45 -0700 Subject: [PATCH 2/3] Relocate support for to_dom_selector to dom_id --- lib/cable_ready/identifiable.rb | 19 ++++++++++--------- lib/cable_ready/operation_builder.rb | 2 +- test/lib/cable_ready/cable_car_test.rb | 13 ++++++++++++- test/lib/cable_ready/identifiable_test.rb | 2 -- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/lib/cable_ready/identifiable.rb b/lib/cable_ready/identifiable.rb index c3c60704..acd24f1e 100644 --- a/lib/cable_ready/identifiable.rb +++ b/lib/cable_ready/identifiable.rb @@ -5,7 +5,11 @@ module Identifiable def dom_id(record, prefix = nil) prefix = prefix.to_s.strip if prefix - id = if record.is_a?(ActiveRecord::Relation) + id = if record.respond_to?(:to_dom_selector) + return record.to_dom_selector + elsif record.respond_to?(:to_dom_id) + record.to_dom_id + elsif record.is_a?(ActiveRecord::Relation) [prefix, record.model_name.plural].compact.join("_") elsif record.is_a?(ActiveRecord::Base) ActionView::RecordIdentifier.dom_id(record, prefix) @@ -16,14 +20,11 @@ def dom_id(record, prefix = nil) "##{id}".squeeze("#").strip end - def determine_dom_selector(obj) - if obj.respond_to?(:to_dom_selector) - obj.to_dom_selector - elsif obj.is_a?(ActiveRecord::Base) || obj.is_a?(ActiveRecord::Relation) - dom_id(obj) - else - obj.to_s - end + def identifiable?(obj) + obj.respond_to?(:to_dom_selector) || + obj.respond_to?(:to_dom_id) || + obj.is_a?(ActiveRecord::Relation) || + obj.is_a?(ActiveRecord::Base) end end end diff --git a/lib/cable_ready/operation_builder.rb b/lib/cable_ready/operation_builder.rb index 23221c14..837a8cb1 100644 --- a/lib/cable_ready/operation_builder.rb +++ b/lib/cable_ready/operation_builder.rb @@ -32,7 +32,7 @@ def add_operation_method(name) options["selector"] = previous_selector if previous_selector && options.exclude?("selector") if options.include?("selector") @previous_selector = options["selector"] - options["selector"] = determine_dom_selector(previous_selector) + options["selector"] = identifiable?(previous_selector) ? dom_id(previous_selector) : previous_selector end @enqueued_operations[name.to_s] << options self diff --git a/test/lib/cable_ready/cable_car_test.rb b/test/lib/cable_ready/cable_car_test.rb index b09e77eb..95554666 100644 --- a/test/lib/cable_ready/cable_car_test.rb +++ b/test/lib/cable_ready/cable_car_test.rb @@ -30,7 +30,18 @@ class CableReady::CableCarTest < ActiveSupport::TestCase CableReady::CableCar.instance.reset! my_object = Struct.new(:id) do def to_dom_selector - "##{id}" + ".#{id}" + end + end.new("users") + dispatch = CableReady::CableCar.instance.inner_html(selector: my_object, html: "winning").dispatch + assert_equal({"innerHtml" => [{"selector" => ".users", "html" => "winning"}]}, dispatch) + end + + test "selectors should accept any object which respond_to? to_dom_id" do + CableReady::CableCar.instance.reset! + my_object = Struct.new(:id) do + def to_dom_id + id end end.new("users") dispatch = CableReady::CableCar.instance.inner_html(selector: my_object, html: "winning").dispatch diff --git a/test/lib/cable_ready/identifiable_test.rb b/test/lib/cable_ready/identifiable_test.rb index 0a8b6a4c..35efa1c4 100644 --- a/test/lib/cable_ready/identifiable_test.rb +++ b/test/lib/cable_ready/identifiable_test.rb @@ -71,7 +71,5 @@ class CableReady::IdentifiableTest < ActiveSupport::TestCase assert_equal "#user_99", dom_id(user) assert_equal "#user_99", dom_id(user, nil) assert_equal "#all_active_user_99", dom_id(user, "all_active") - - assert_equal "#user_99", determine_dom_selector(user) end end From b334e2d0834dead17351e1da9d74ebaab33cfa0f Mon Sep 17 00:00:00 2001 From: Jared White Date: Mon, 7 Jun 2021 18:03:06 -0700 Subject: [PATCH 3/3] Use a guard statement --- lib/cable_ready/identifiable.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/cable_ready/identifiable.rb b/lib/cable_ready/identifiable.rb index acd24f1e..0bd1b646 100644 --- a/lib/cable_ready/identifiable.rb +++ b/lib/cable_ready/identifiable.rb @@ -3,11 +3,11 @@ module CableReady module Identifiable def dom_id(record, prefix = nil) + return record.to_dom_selector if record.respond_to?(:to_dom_selector) + prefix = prefix.to_s.strip if prefix - id = if record.respond_to?(:to_dom_selector) - return record.to_dom_selector - elsif record.respond_to?(:to_dom_id) + id = if record.respond_to?(:to_dom_id) record.to_dom_id elsif record.is_a?(ActiveRecord::Relation) [prefix, record.model_name.plural].compact.join("_")