Module: Searchlogic::RailsHelpers

Defined in:
lib/searchlogic/rails_helpers.rb

Instance Method Summary collapse

Instance Method Details

#order(search, options = {}, html_options = {}) ⇒ Object

Creates a link that alternates between acending and descending. It basically alternates between calling 2 named scopes: “ascend_by_*” and “descend_by_*”

By default Searchlogic gives you these named scopes for all of your columns, but if you wanted to create your own, it will work with those too.

Examples:

order @search, :by => :username
order @search, :by => :created_at, :as => "Created"

This helper accepts the following options:

  • :by - the name of the named scope. This helper will prepend this value with “ascend_by_” and “descend_by_”

  • :as - the text used in the link, defaults to whatever is passed to :by

  • :ascend_scope - what scope to call for ascending the data, defaults to “ascend_by_:by”

  • :descend_scope - what scope to call for descending the data, defaults to “descend_by_:by”

  • :params - hash with additional params which will be added to generated url

  • :params_scope - the name of the params key to scope the order condition by, defaults to :search



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
# File 'lib/searchlogic/rails_helpers.rb', line 22

def order(search, options = {}, html_options = {})
  options[:params_scope] ||= :search
  if !options[:as]
    id = options[:by].to_s.downcase == "id"
    options[:as] = id ? options[:by].to_s.upcase : options[:by].to_s.humanize
  end
  options[:ascend_scope] ||= "ascend_by_#{options[:by]}"
  options[:descend_scope] ||= "descend_by_#{options[:by]}"
  ascending = search.order.to_s == options[:ascend_scope]
  new_scope = ascending ? options[:descend_scope] : options[:ascend_scope]
  selected = [options[:ascend_scope], options[:descend_scope]].include?(search.order.to_s)
  if selected
    css_classes = html_options[:class] ? html_options[:class].split(" ") : []
    if ascending
      options[:as] = "▲ #{options[:as]}"
      css_classes << "ascending"
    else
      options[:as] = "&#9660;&nbsp;#{options[:as]}"
      css_classes << "descending"
    end
    html_options[:class] = css_classes.join(" ")
  end
  url_options = {
    options[:params_scope] => search.conditions.merge( { :order => new_scope } )
  }.deep_merge(options[:params] || {})

  options[:as] = raw(options[:as]) if defined?(RailsXss)

  link_to options[:as], url_for(url_options), html_options
end