diff --git a/lib/reactionview/template/handlers/erb.rb b/lib/reactionview/template/handlers/erb.rb index 14c082b..e6a2aa8 100644 --- a/lib/reactionview/template/handlers/erb.rb +++ b/lib/reactionview/template/handlers/erb.rb @@ -11,7 +11,9 @@ class ERB < ActionView::Template::Handlers::ERB def call(template, source) return super unless intercept_template?(template) - ::ReActionView::Template::Handlers::Herb.call(template, source) + ::ReActionView::Template::Handlers::Herb.call( + template, source, validation_mode: herb_validation_mode(template) + ) rescue StandardError => e raise unless fall_back_to_erb?(template) @@ -28,6 +30,13 @@ def intercept_template?(template) local_template?(template) || ReActionView.config.external_template_mode != :skip end + def herb_validation_mode(template) + return nil if local_template?(template) + return nil unless ReActionView.config.external_template_mode == :fallback + + :raise + end + def fall_back_to_erb?(template) !local_template?(template) && ReActionView.config.external_template_mode == :fallback end diff --git a/lib/reactionview/template/handlers/herb.rb b/lib/reactionview/template/handlers/herb.rb index 06dfee2..5488a89 100644 --- a/lib/reactionview/template/handlers/herb.rb +++ b/lib/reactionview/template/handlers/herb.rb @@ -10,7 +10,11 @@ class Herb < ActionView::Template::Handlers::ERB class_attribute :erb_implementation, default: Handlers::Herb::Herb - def call(template, source) + def self.call(template, source, validation_mode: nil) + new.call(template, source, validation_mode: validation_mode) + end + + def call(template, source, validation_mode: nil) visitors = [] if ::ReActionView.config.debug_mode_enabled? && local_template?(template) @@ -23,7 +27,7 @@ def call(template, source) config = { filename: template.identifier, project_path: Rails.root.to_s, - validation_mode: validation_mode_for(template), + validation_mode: validation_mode || ReActionView.config.validation_mode, content_for_head: reactionview_dev_tools_markup(template), visitors: visitors + ReActionView.config.transform_visitors, } @@ -39,13 +43,6 @@ def layout_template?(template) template.identifier.include?("/layouts/") end - def validation_mode_for(template) - return ReActionView.config.validation_mode if local_template?(template) - return ReActionView.config.validation_mode if ReActionView.config.external_template_mode == :compile - - :raise - end - def active_support_editor return unless defined?(ActiveSupport::Editor) return if ActiveSupport::Editor.current.blank? diff --git a/test/template/handlers/external_template_mode_test.rb b/test/template/handlers/external_template_mode_test.rb index 70d3a12..2a69958 100644 --- a/test/template/handlers/external_template_mode_test.rb +++ b/test/template/handlers/external_template_mode_test.rb @@ -127,6 +127,28 @@ def compile(source, identifier) ReActionView.config.validation_mode = nil end + test "external .herb templates use the configured validation mode" do + ReActionView.config.external_template_mode = :fallback + ReActionView.config.validation_mode = :overlay + + template = ActionView::Template.new( + INVALID, + "/gems/some_gem/app/views/x.html.herb", + ReActionView::Template::Handlers::Herb, + virtual_path: "x", + format: :html, + locals: [] + ) + + compiled = Rails.stub(:root, Pathname.new(RAILS_ROOT)) do + ReActionView::Template::Handlers::Herb.call(template, INVALID) + end + + assert_includes compiled, "data-herb-validation-error" + ensure + ReActionView.config.validation_mode = nil + end + test "local template failures always raise, whatever the mode" do ReActionView.config.external_template_mode = :fallback ReActionView.config.validation_mode = :raise