Иконка Rails & Ransack, показывающая, что поле можно сортировать

Я работаю над требованием для приложения Rails добавить значок в заголовок столбца для результата списка из формы Ransack. Значок должен представлять собой двойную стрелку, похожую по стилю на значки, которые Ransack добавляет к заголовку столбца, чтобы показать, что он был отсортирован по этому столбцу. Что-то вроде этого Значок сортировки. Значок Ransack sort_asc или sort_desc должен заменить значок сортировки. Я искал документацию Ransack, Stackoverflow и google в целом безрезультатно.
Вот фрагмент списка поиска *.html.haml файла.

%table.table.table-hover
    %thead
        %tr
            %th
                = sort_link(@query, :title)
            %th
                = sort_link(@query, :description)
            %th
                = sort_link(@query, :company_name, 'Company')
            %th
                = sort_link(@query, :shift)
            %th
                = sort_link(@query, :address_state)
            %th
                = sort_link(@query, :address_city)`and the direction of the sort.

person Paul Caston    schedule 23.01.2017    source источник


Ответы (3)


У Ransack есть параметры конфигурации для custom_arrows. Вы можете использовать его в инициализаторе поиска, чтобы переопределить стрелки по умолчанию. Например:

Ransack.configure do |config|
    config.custom_arrows = {
      up_arrow: '<i class="fa fa-long-arrow-up"></i>',
      down_arrow: 'U+02193'
    }
  end
person Slava.K    schedule 23.01.2017
comment
да, но есть ли способ установить значок для начального отображения несортированного столбца, чтобы показать, что он сортируется? - person Paul Caston; 23.01.2017
comment
@PaulCaston Ransack не поддерживает такое поведение. Вам нужно будет переопределить метод order_indicator в ransack FormHelper: github.com/activerecord-hackery/ransack/blob/ - person Slava.K; 23.01.2017
comment
Спасибо @Slava.K как раз то, что я искал. - person Paul Caston; 27.01.2017
comment
@PaulCaston, теперь вы можете использовать default_arrow - person lafeber; 14.04.2021

Как упоминал @Slava.K, вы можете настроить конфигурацию Ransack в инициализаторе или переопределить Ransack FormHelper.

Но если вы хотите сделать это вручную в своем представлении, вы можете это сделать! Используйте помощник sort_url для создания ссылки, затем проверьте массив sorts Ransack, чтобы определить, какая сортировка используется и в каком направлении (по возрастанию/убыванию), а затем отобразите соответствующий значок.

В этом примере будет отображаться один из трех значков (вверх/вниз/нейтральный) в зависимости от того, было ли поле отсортировано или нет, и в каком направлении оно было отсортировано. Мы будем использовать гем fontawesome-sass для рендеринга значка, но вы можете заменить icon() helper с любым методом/разметкой значка, который вы хотите использовать.

  # some_view.html.slim

  = link_to sort_url(@q, :name)

    # Display label
    span Name

    # Sort icon

    # Check if ransack applied a sort to this field
    - sort = @q.sorts.find {|s| s.name == 'name'}

    # Render appropriate icon (up/down/neutral)
    
    # If this column is sorted by 'asc' display 'sort-up' icon
    = icon(:fas, 'sort-up') if sort.present? and sort.dir == 'asc'

    # If this column is sorted by 'desc' display 'sort-down' icon
    = icon(:fas, 'sort-down') if sort.present? and sort.dir == 'desc'

    # If no sort is applied display a neutral icon
    = icon(:fas, 'sort') unless sort.present?

Мы можем упростить приведенный выше код, используя тернарный оператор, например так...

  # some_view.html.slim

  = link_to sort_url(@q, :name)
    span Name
    - sort = @q.sorts.find {|s| s.name == 'name'}
    = icon :fas, sort.present? ? (sort.dir == 'asc' ? 'sort-up' : 'sort-down') : 'sort'

Если вы хотите получить действительно фантазию и сохранить СУХОЕ представление, вы можете создать вспомогательный метод, похожий на Ransacks sort_url или sort_link, и поместить в него эту разметку. Это может выглядеть примерно так...

  # some_helper.rb

  def custom_sort_link(search_object, attribute, *args)
    link_to sort_url(search_object, attribute, *args) do
      sort = search_object.sorts.find {|s| s.name == attribute.to_s}
      content_tag(:span, attribute.to_s.capitalize) + icon(:fas, sort.present? ? (sort.dir == 'asc' ? 'sort-up' : 'sort-down') : 'sort')
    end
  end

А затем, по-вашему, вызовите custom_sort_link вот так...

  # some_view.html.slim

  = custom_sort_link(@q, :name)

В качестве примечания: если у вас есть FontAwesome Pro, двухцветные значки выглядят намного лучше. Просто замените :fas на :fad.

person Tayden    schedule 30.06.2020

Значок сортировки по умолчанию может быть реализован следующим образом:

if defined?(Ransack)
  Ransack.configure do |config|
    config.custom_arrows = { default_arrow: '<i class="fa fa-sort"></i>' }
  end
end
person lafeber    schedule 14.04.2021