Class: ComfortableMexicanSofa::Content::Tag::Helper

Inherits:
ComfortableMexicanSofa::Content::Tag show all
Defined in:
lib/comfortable_mexican_sofa/content/tags/helper.rb

Overview

Tag for injecting view helpers. Example tag:

{{cms:helper method_name, param_a, param_b, foo: bar}}

This expands into something like this:

<%= method_name("param_a", "param_b", "foo" => "bar") %>

Whitelist is can be used to control what helpers are available. By default there’s a blacklist of methods that should not be called.

Constant Summary collapse

BLACKLIST =
%w[eval class_eval instance_eval render].freeze

Instance Attribute Summary collapse

Attributes inherited from ComfortableMexicanSofa::Content::Tag

#context, #params, #source

Instance Method Summary collapse

Methods inherited from ComfortableMexicanSofa::Content::Tag

#nodes

Constructor Details

#initialize(context:, params: [], source: nil) ⇒ Helper

Returns a new instance of Helper.



16
17
18
19
20
21
22
23
# File 'lib/comfortable_mexican_sofa/content/tags/helper.rb', line 16

def initialize(context:, params: [], source: nil)
  super
  @method_name = params.shift

  unless @method_name.present?
    raise Error, "Missing method name for helper tag"
  end
end

Instance Attribute Details

#method_nameObject (readonly)

Returns the value of attribute method_name.



14
15
16
# File 'lib/comfortable_mexican_sofa/content/tags/helper.rb', line 14

def method_name
  @method_name
end

Instance Method Details

#allow_erb?Boolean

we output erb into rest of the content

Returns:

  • (Boolean)


26
27
28
# File 'lib/comfortable_mexican_sofa/content/tags/helper.rb', line 26

def allow_erb?
  true
end

#contentObject



30
31
32
33
34
35
36
37
38
39
40
# File 'lib/comfortable_mexican_sofa/content/tags/helper.rb', line 30

def content
  helper_params = params.map do |p|
    case p
    when Hash
      format("%<arg>s", arg: p)
    else
      format("%<arg>p", arg: p)
    end
  end.join(",")
  "<%= #{method_name}(#{helper_params}) %>"
end

#renderObject



42
43
44
45
46
47
48
49
# File 'lib/comfortable_mexican_sofa/content/tags/helper.rb', line 42

def render
  whitelist = ComfortableMexicanSofa.config.allowed_helpers
  if whitelist.is_a?(Array)
    content if whitelist.map!(&:to_s).member?(method_name)
  else
    content unless BLACKLIST.member?(method_name)
  end
end