Module: Ransack::Helpers::FormHelper

Defined in:
lib/ransack/helpers/form_helper.rb

Instance Method Summary collapse

Instance Method Details

#ascObject



5
6
7
# File 'lib/ransack/helpers/form_helper.rb', line 5

def asc
  'asc'.freeze
end

#asc_arrowObject



13
14
15
# File 'lib/ransack/helpers/form_helper.rb', line 13

def asc_arrow
  '▲'.freeze
end

#descObject



9
10
11
# File 'lib/ransack/helpers/form_helper.rb', line 9

def desc
  'desc'.freeze
end

#desc_arrowObject



17
18
19
# File 'lib/ransack/helpers/form_helper.rb', line 17

def desc_arrow
  '▼'.freeze
end

#non_breaking_spaceObject



21
22
23
# File 'lib/ransack/helpers/form_helper.rb', line 21

def non_breaking_space
  ' '.freeze
end

#search_form_for(record, options = {}, &proc) ⇒ Object



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
# File 'lib/ransack/helpers/form_helper.rb', line 25

def search_form_for(record, options = {}, &proc)
  if record.is_a?(Ransack::Search)
    search = record
    options[:url] ||= polymorphic_path(
      search.klass, format: options.delete(:format)
      )
  elsif record.is_a?(Array) &&
      (search = record.detect { |o| o.is_a?(Ransack::Search) })
    options[:url] ||= polymorphic_path(
      record.map { |o| o.is_a?(Ransack::Search) ? o.klass : o },
      format: options.delete(:format)
      )
  else
    raise ArgumentError,
      "No Ransack::Search object was provided to search_form_for!"
  end
  options[:html] ||= {}
  html_options = {
    :class => options[:class].present? ?
      "#{options[:class]}" :
      "#{search.klass.to_s.underscore}_search",
    :id => options[:id].present? ?
      "#{options[:id]}" :
      "#{search.klass.to_s.underscore}_search",
    :method => :get
  }
  options[:as] ||= 'q'.freeze
  options[:html].reverse_merge!(html_options)
  options[:builder] ||= FormBuilder

  form_for(record, options, &proc)
end

Raises:

  • (TypeError)


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/ransack/helpers/form_helper.rb', line 58

def sort_link(search, attribute, *args)
  # Extract out a routing proxy for url_for scoping later
  if search.is_a?(Array)
    routing_proxy = search.shift
    search = search.first
  end

  raise TypeError, "First argument must be a Ransack::Search!" unless
    Search === search

  search_params = params[search.context.search_key].presence ||
    {}.with_indifferent_access

  attr_name = attribute.to_s

  name = (
    if args.size > 0 && !args.first.is_a?(Hash)
      args.shift.to_s
    else
      Translate.attribute(attr_name, :context => search.context)
    end
    )

  if existing_sort = search.sorts.detect { |s| s.name == attr_name }
    prev_attr, prev_dir = existing_sort.name, existing_sort.dir
  end

  options = args.first.is_a?(Hash) ? args.shift.dup : {}
  default_order = options.delete :default_order
  current_dir = prev_attr == attr_name ? prev_dir : nil

  if current_dir
    new_dir = current_dir == desc ? asc : desc
  else
    new_dir = default_order || asc
  end

  html_options = args.first.is_a?(Hash) ? args.shift.dup : {}
  css = ['sort_link', current_dir].compact.join(' ')
  html_options[:class] = [css, html_options[:class]].compact.join(' ')
  query_hash = {}
  query_hash[search.context.search_key] = search_params
  .merge(:s => "#{attr_name} #{new_dir}")
  options.merge!(query_hash)
  options_for_url = params.merge options

  url = if routing_proxy && respond_to?(routing_proxy)
    send(routing_proxy).url_for(options_for_url)
  else
    url_for(options_for_url)
  end

  link_to(
    [ERB::Util.h(name), order_indicator_for(current_dir)]
      .compact
      .join(non_breaking_space)
      .html_safe,
    url,
    html_options
    )
end