【问题标题】:undefined method `[]' for nil:NilClass on select_options [Filterrific Gem]nil 的未定义方法“[]”:select_options [Filterrific Gem] 上的 NilClass
【发布时间】:2017-01-07 04:01:36
【问题描述】:

您好,我正在使用 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

这是错误的截图:

请帮忙。谢谢!

【问题讨论】:

  • @filterrific.select_options有什么值吗?你检查了吗?
  • @Deep 当然可以。在那里查看我更新的问题。我已经包含了 users_controller.rb 的代码

标签: ruby-on-rails ruby-on-rails-4 filterrific


【解决方案1】:

在您的控制器中进行初始化时。参数不包含 select_options。它们应包含 select_options。现在它看起来像:

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

应该是这样的

"filterrific"=>{"search_query"=>"", "select_options"=>YOUR-OPTIONS}

【讨论】:

    【解决方案2】:

    在您的用户控制器中

    您需要设置控制器以接受您的选择选项和您需要的其他参数,就像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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      相关资源
      最近更新 更多