Skip to content

Commit 8dd6d5a

Browse files
authored
Allow register_output_helper to mark output safe before call to raw (#303)
1 parent aaa8b95 commit 8dd6d5a

2 files changed

Lines changed: 36 additions & 2 deletions

File tree

lib/phlex/rails/helper_macros.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module Phlex::Rails::HelperMacros
44
# Register a Rails helper that returns safe HTML to be pushed to the output buffer.
5-
def register_output_helper(method_name)
5+
def register_output_helper(method_name, mark_safe: false)
66
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
77
# frozen_string_literal: true
88
@@ -13,7 +13,7 @@ def #{method_name}(*args, **kwargs, &block)
1313
view_context.#{method_name}(*args, **kwargs)
1414
end
1515
16-
raw(output)
16+
raw(#{mark_safe ? 'safe(output)' : 'output'})
1717
end
1818
RUBY
1919
end

test/helper_macros.test.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# frozen_string_literal: true
2+
3+
test "register_output_helper with raw marked safe" do
4+
view_ctx = ActionController::Base.new.view_context
5+
view_ctx.define_singleton_method(:raw_html_producing_method) { "<span>ok</span>" }
6+
7+
component = Class.new(Phlex::HTML) do
8+
register_output_helper :raw_html_producing_method, mark_safe: true
9+
10+
def view_template
11+
div { raw_html_producing_method }
12+
end
13+
end
14+
15+
assert_equivalent_html component.render_in(view_ctx), "<div><span>ok</span></div>"
16+
end
17+
18+
test "register_output_helper with raw not marked safe (default)" do
19+
view_ctx = ActionController::Base.new.view_context
20+
view_ctx.define_singleton_method(:raw_html_producing_method) { "<span>ok</span>" }
21+
22+
component = Class.new(Phlex::HTML) do
23+
register_output_helper :raw_html_producing_method
24+
25+
def view_template
26+
div { raw_html_producing_method }
27+
end
28+
end
29+
30+
error = assert_raises Phlex::ArgumentError do
31+
component.render_in(view_ctx)
32+
end
33+
assert_equal error.message, "You passed an unsafe object to `raw`."
34+
end

0 commit comments

Comments
 (0)