неопределенный метод `[]' для nil:NilClass в select_options [Filterrific Gem]

Привет, я использую Filterrific Gem, чтобы добавить функции поиска и фильтрации для моей страницы пользователей.

Поиск работает нормально, но я получил ошибку undefined method[]' for nil:NilClass`, когда пытался реализовать фильтрацию "отсортировано по".

Я ссылаюсь на документацию Filterrific здесь: http://filterrific.clearcove.ca/pages/action_view_api.html

Вот мои коды:

index.html.erb

<div class="well">
    <%= form_for_filterrific @filterrific do |f| %>
      <div>
        <%= f.text_field( :search_query, id: "filterrific-no-ajax-auto-submit" ,class: 'form-control', placeholder: "Search users...") %>
      </div>

        <div>
            Sorted by
            <% f.select(:sorted_by, @filterrific.select_options[:sorted_by]) %>
        </div>
    <% end %>
</div>

<div class="row">
    <%= render(
      partial: 'users/list',
      locals: { users: @users }
    ) %>
</div>

model.rb

filterrific(
    default_filter_params: { sorted_by: 'first_name_asc' },
    available_filters: [
      :sorted_by,
      :search_query,
      :with_created_at
    ]
)

scope :sorted_by, lambda { |sort_option|
  direction = (sort_option =~ /desc$/) ? 'desc' : 'asc'
  case sort_option.to_s
  when /^first_name/

    order("users.first_name #{ direction }")
  else
    raise(ArgumentError, "Invalid sort option: #{ sort_option.inspect }")
  end
}

users_controller.rb

def index
  @filterrific = initialize_filterrific( User, params[:filterrific] ) or return
  @users = @filterrific.find.page(params[:page]).order('first_name ASC')

  respond_to do |format|
    format.html
    format.js
  end
end

Вот скриншот ошибки:

введите здесь описание изображения

Пожалуйста помоги. Спасибо!


person Ryzal Yusoff    schedule 07.01.2017    source источник
comment
Есть ли значение в @filterrific.select_options? Вы проверили это?   -  person Deepesh    schedule 07.01.2017
comment
@Глубоко, да, конечно. Смотрите мой обновленный вопрос там. Я включил свой код для users_controller.rb   -  person Ryzal Yusoff    schedule 07.01.2017


Ответы (2)


Во время инициализации в вашем контроллере. Параметры не содержат select_options. Они должны содержать select_options. Прямо сейчас это выглядит так:

"filterrific"=>{"search_query"=>""}

это будет что-то вроде

"filterrific"=>{"search_query"=>"", "select_options"=>ВАШИ ВАРИАНТЫ}

person Shikhar Mann    schedule 10.01.2017

В вашем контроллере пользователей

Вам нужно настроить контроллер так, чтобы он принимал выбранные вами параметры и другие параметры, которые вам понадобятся, так же, как with_created_at.

def index
  @filterrific = initialize_filterrific(
    User,
    params[:filterrific],

    select_options: {
      :sorted_by => User.options_for_sorted_by
    }
  ) or return
  @users = @filterrific.find.page(params[:page])

  respond_to do |format|
    format.html
    format.json
  end
end

В вашей пользовательской модели

Вам также понадобятся эти методы, которые вы вызвали в своем контроллере, для записи в вашу модель, и вам не нужно указывать with_created_at как конкретный фильтр, он может быть в options for sorted by, как в этом примере выше.

scope :sorted_by, lambda { |sort_option|
  direction = (sort_option =~ /desc$/) ? 'desc' : 'asc'

  case sort_option.to_s
  when /^first_name/
    order("users.first_name #{ direction }")
  when /^last_name/
    order("users.last_name #{ direction }")
  when /^created_at/
    order("LOWER(users.created_at) #{ direction }")
  else
    raise(ArgumentError, "Invalid sort option: #{ sort_option.inspect }")
  end
}

def self.options_for_sorted_by
  [
    ['First Name (a-z)', 'first_name_asc'],
    ['Last Name (a-z)', 'last_name_asc'],
    ['Created at (newer first)', 'created_at_desc'],
    ['Created at (older first)', 'created_at_asc'],
  ]
end

И последнее, но не менее важное: вы должны установить области действия, чтобы ваш search_query работал так, как нужно. Вы можете определить области для определенных фильтров, подобных этому.

filterrific(
    default_filter_params: { sorted_by: 'first_name_asc' },
    available_filters: [
      :sorted_by,
      :search_query, # defining a search query to find in the db fields
      :school # defining a scope to a foreign key
    ]
)

# here i setup the search query
scope :search_query, lambda { |query|
  where("first_name LIKE ? OR last_name LIKE ?", "%#{query}%", "%#{query}%")
}

# here i setup the scope for a foreign key
scope :school, -> school_id { where(:school_id => school_id) }

Чтобы узнать больше об этом драгоценном камне, вот ссылка на документацию. Вы должны выполнить все шаги на боковой панели в том порядке, в котором они отображаются, чтобы получить более полное и простое представление о драгоценном камне.

http://filterrific.clearcove.ca/

person Rannyeri Rodrigues    schedule 24.10.2018