Module: Ransack::Helpers::FormHelper
- Defined in:
- lib/ransack/helpers/form_helper.rb
Instance Method Summary collapse
- #search_form_for(record, options = {}, &proc) ⇒ Object
-
#sort_link(search, attribute, *args) ⇒ Object
sort_link @q, :name, [:name, ‘kind ASC’], ‘Player Name’.
Instance Method Details
#search_form_for(record, options = {}, &proc) ⇒ Object
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 |
# File 'lib/ransack/helpers/form_helper.rb', line 5 def search_form_for(record, = {}, &proc) if record.is_a?(Ransack::Search) search = record [:url] ||= polymorphic_path( search.klass, format: .delete(:format) ) elsif record.is_a?(Array) && (search = record.detect { |o| o.is_a?(Ransack::Search) }) [:url] ||= polymorphic_path( record.map { |o| o.is_a?(Ransack::Search) ? o.klass : o }, format: .delete(:format) ) else raise ArgumentError, "No Ransack::Search object was provided to search_form_for!" end [:html] ||= {} = { :class => [:class].present? ? "#{[:class]}" : "#{search.klass.to_s.underscore}_search", :id => [:id].present? ? "#{[:id]}" : "#{search.klass.to_s.underscore}_search", :method => :get } [:as] ||= Ransack::Constants::DEFAULT_SEARCH_KEY [:html].reverse_merge!() [:builder] ||= FormBuilder form_for(record, , &proc) end |
#sort_link(search, attribute, *args) ⇒ Object
sort_link @q, :name, [:name, ‘kind ASC’], ‘Player Name’
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/ransack/helpers/form_helper.rb', line 39 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 # This is the field that this link represents. The direction of the sort icon (up/down arrow) will # depend on the sort status of this field field_name = attribute.to_s # Determine the fields we want to sort on sort_fields = if Array === args.first args.shift else Array(field_name) end label_text = if String === args.first args.shift.to_s else Translate.attribute(field_name, :context => search.context) end = args.first.is_a?(Hash) ? args.shift.dup : {} default_order = .delete :default_order default_order_is_a_hash = Hash === default_order # If the default order is a hash of fields, duplicate it and let us access it with strings or symbols default_order = default_order.dup.with_indifferent_access if default_order_is_a_hash search_params = params[search.context.search_key].presence || {}.with_indifferent_access # Find the current direction (if there is one) of the primary sort field if existing_sort = search.sorts.detect { |s| s.name == field_name } field_current_dir = existing_sort.dir end sort_params = [] Array(sort_fields).each do |sort_field| attr_name, new_dir = sort_field.to_s.downcase.split(/\s+/) current_dir = nil # if the user didn't specify the sort direction, detect the previous # sort direction on this field and reverse it if Ransack::Constants::ASC_DESC.none? { |d| d == new_dir } if existing_sort = search.sorts.detect { |s| s.name == attr_name } current_dir = existing_sort.dir end new_dir = if current_dir if current_dir == Ransack::Constants::DESC Ransack::Constants::ASC else Ransack::Constants::DESC end elsif default_order_is_a_hash default_order[attr_name] || Ransack::Constants::ASC else default_order || Ransack::Constants::ASC end end sort_params << "#{attr_name} #{new_dir}" end # if there is only one sort parameter, remove it from the array and just # use the string as the parameter sort_params = sort_params.first if sort_params.size == 1 = args.first.is_a?(Hash) ? args.shift.dup : {} css = [Ransack::Constants::SORT_LINK, field_current_dir] .compact.join(Ransack::Constants::SPACE) [:class] = [css, [:class]] .compact.join(Ransack::Constants::SPACE) query_hash = {} query_hash[search.context.search_key] = search_params .merge(:s => sort_params) .merge!(query_hash) = params.merge() url = if routing_proxy && respond_to?(routing_proxy) send(routing_proxy).url_for() else url_for() end name = link_name(label_text, field_current_dir) link_to(name, url, ) end |