簡體   English   中英

未定義的方法`[]'為nil:select_options上的NilClass [Filterrific Gem]

[英]undefined method `[]' for nil:NilClass on select_options [Filterrific Gem]

您好我使用Filterrific Gem為我的用戶頁面添加搜索和過濾功能。

搜索工作正常,但是當我嘗試實現“排序依據”過濾時,我得到了nil:NilClass`錯誤的undefined method []'。

我在這里引用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

以下是錯誤的屏幕截圖:

在此輸入圖像描述

請幫忙。 謝謝!

在控制器中初始化時。 參數不包含select_options。 它們應包含select_options。 現在它看起來像:

“filterrific”=> { “SEARCH_QUERY”=> “”}

它應該是這樣的

“filterrific”=> {“search_query”=>“”,“select_options”=>你的選項}

在您的用戶控制器中

您需要設置控制器以接受您選擇的選項以及您需要的其他參數,就像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) }

要了解有關此gem的更多信息,請參閱文檔鏈接。 您必須按照顯示的順序執行側欄中的所有步驟,以更全面,更輕松地了解gem

http://filterrific.clearcove.ca/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM