Module: Acts::DataTable::SortableColumns::ActionController::ClassMethods

Defined in:
lib/acts_as_data_table/sortable_columns/action_controller.rb

Instance Method Summary collapse

Instance Method Details

#sortable_columns(options = {}) ⇒ Object

Sets up automatic column sorting for this controller

sortable_columns :only => [:index], :default => {:index => [['deleted_at', 'ASC'], ['name', 'ASC']]}

Examples:

Set up automatic column sorting only for the index action

with the default ordering "deleted_at ASC, name ASC"

Parameters:

  • options (Hash) (defaults to: {})

    Options to specify which controller actions should have column sorting and to customize the filter’s behaviour. Options are everything that #around_filter would accept

Options Hash (options):

  • :default (Hash)

    Default sorting columns for different actions. If none are specified for an action, the default order (usually ‘id ASC’) is used



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
62
63
64
65
66
67
68
69
# File 'lib/acts_as_data_table/sortable_columns/action_controller.rb', line 28

def sortable_columns(options = {})
  #Include on-demand methods
  include Acts::DataTable::Shared::ActionController::OnDemand

  defaults = (options.delete(:default) || {}).stringify_keys

  around_filter(options) do |controller, block|

    af_params        = controller.request.params[:sortable_columns]
    request_defaults = defaults[controller.action_name.to_s] || []

    begin
      #Ensure that the given action is valid
      if af_params.present? && %w(toggle change_direction set_base set).include?(af_params[:action].to_s)
        case af_action = af_params[:action].to_s
          when 'toggle'
            controller.acts_as_data_table_session.toggle_column!(af_params[:model], af_params[:column])
          when 'change_direction'
            controller.acts_as_data_table_session.change_direction!(af_params[:model], af_params[:column])
          when 'set_base'
            controller.acts_as_data_table_session.set_base_column!(af_params[:model], af_params[:column])
          when 'set'
            controller.acts_as_data_table_session.set_columns!(af_params[:columns])
          else
            raise ArgumentError.new "Invalid scope filter action '#{af_action}' was given."
        end
      end

      #Set the defaults as sorting columns none were set by the user
      if controller.acts_as_data_table_session.active_columns.empty?
        controller.acts_as_data_table_session.set_columns!(request_defaults)
      end

      #Set the updated filters
      Acts::DataTable::SortableColumns::ActionController.set_request_sort_columns!(controller.acts_as_data_table_session.active_columns)
      block.call
    ensure
      Acts::DataTable::SortableColumns::ActionController.clear_request_sort_columns!
    end

  end
end