Module: ActionView::Helpers::UrlHelper

Included in:
Frontpack::FormBuilder
Defined in:
lib/frontpack/button_to_patch.rb

Instance Method Summary collapse

Instance Method Details

#button_to(name = nil, options = nil, html_options = nil, &block) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/frontpack/button_to_patch.rb', line 4

def button_to(name = nil, options = nil, html_options = nil, &block)
  html_options, options = options, name if block_given?
  html_options ||= {}
  html_options = html_options.stringify_keys

  url = case options
          when FalseClass then nil
          else url_for(options)
        end

  remote = html_options.delete("remote")
  params = html_options.delete("params")

  authenticity_token = html_options.delete("authenticity_token")

  method     = (html_options.delete("method").presence || method_for_options(options)).to_s
  method_tag = BUTTON_TAG_METHOD_VERBS.include?(method) ? method_tag(method) : "".html_safe

  form_id = html_options.delete("form_id") || SecureRandom.hex(8)
  form_method  = method == "get" ? "get" : "post"
  form_options = html_options.delete("form") || {}
  form_options[:class] ||= html_options.delete("form_class") || "button_to"
  form_options[:method] = form_method
  form_options[:action] = url
  form_options[:id] = form_id
  form_options[:'data-remote'] = true if remote

  request_token_tag = if form_method == "post"
                        request_method = method.empty? ? "post" : method
                        token_tag(authenticity_token, form_options: { action: url, method: request_method })
                      else
                        ""
                      end

  html_options = convert_options_to_data_attributes(options, html_options)
  html_options["type"] = "submit"


  html_options["form"] = form_id
  button = if block_given?
             ("button", html_options, &block)
           elsif button_to_generates_button_tag
             ("button", name || url, html_options, &block)
           else
             html_options["value"] = name || url
             tag("input", html_options)
           end

  inner_tags = method_tag.safe_concat(request_token_tag)
  if params
    to_form_params(params).each do |param|
      inner_tags.safe_concat tag(:input, type: "hidden", name: param[:name], value: param[:value],
                                 autocomplete: "off")
    end
  end
  html = ("form", inner_tags, form_options) + button
  prevent_content_exfiltration(html)
end