diff --git a/lib/arbre/element.rb b/lib/arbre/element.rb index 5b947253..f86eaa9a 100644 --- a/lib/arbre/element.rb +++ b/lib/arbre/element.rb @@ -174,7 +174,9 @@ def clear_children! # 4. Call super # ruby2_keywords def method_missing(name, *args, &block) - if current_arbre_element.respond_to?(name) + if "Arbre::Components::#{name.to_s.camelize}".safe_constantize && respond_to?(name) + public_send(name, *args, &block) + elsif current_arbre_element.respond_to?(name) current_arbre_element.send name, *args, &block elsif assigns && assigns.has_key?(name) assigns[name] diff --git a/spec/rails/integration/rendering_spec.rb b/spec/rails/integration/rendering_spec.rb index 08097b81..bba649c0 100644 --- a/spec/rails/integration/rendering_spec.rb +++ b/spec/rails/integration/rendering_spec.rb @@ -27,6 +27,10 @@ def render_with_instance_variable render "arbre/page_with_assignment" end + def render_with_autoloadable_component + render "arbre/page_with_autoloadable_component" + end + def render_partial_with_instance_variable @my_instance_var = "From Instance Var" render "arbre/page_with_arb_partial_and_assignment" @@ -47,6 +51,7 @@ def render_with_block get 'test/render_partial', controller: "test" get 'test/render_erb_partial', controller: "test" get 'test/render_with_instance_variable', controller: "test" + get 'test/render_with_autoloadable_component', controller: "test" get 'test/render_partial_with_instance_variable', controller: "test" get 'test/render_page_with_helpers', controller: "test" get 'test/render_with_block', controller: "test" @@ -95,6 +100,12 @@ def render_with_block expect(body).to have_css("h1", text: "From Instance Var") end + it "renders with autoloadable component" do + get "/test/render_with_autoloadable_component" + expect(response).to be_successful + expect(body).to have_css("div", text: "Autoloadable Component") + end + it "renders an arbre partial with assignments" do get "/test/render_partial_with_instance_variable" expect(response).to be_successful diff --git a/spec/rails/rails_spec_helper.rb b/spec/rails/rails_spec_helper.rb index 8ba6f0e6..76def466 100644 --- a/spec/rails/rails_spec_helper.rb +++ b/spec/rails/rails_spec_helper.rb @@ -6,6 +6,7 @@ if Rails.gem_version >= Gem::Version.new("7.1.0") config.active_support.cache_format_version = 7.1 end + config.autoload_paths << "#{root}/services" end require 'rspec/rails' diff --git a/spec/rails/stub_app/services/arbre/components/autoloadable_component.rb b/spec/rails/stub_app/services/arbre/components/autoloadable_component.rb new file mode 100644 index 00000000..c42d91ff --- /dev/null +++ b/spec/rails/stub_app/services/arbre/components/autoloadable_component.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +class Arbre::Components::AutoloadableComponent < Arbre::Component + builder_method :autoloadable_component + + def build + div "Autoloadable Component" + end +end diff --git a/spec/rails/templates/arbre/page_with_autoloadable_component.arb b/spec/rails/templates/arbre/page_with_autoloadable_component.arb new file mode 100644 index 00000000..f54bba9d --- /dev/null +++ b/spec/rails/templates/arbre/page_with_autoloadable_component.arb @@ -0,0 +1 @@ +autoloadable_component