Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 未定义的方法“[]';对于nil:NilClass on select_选项[Filterrific Gem]_Ruby On Rails_Ruby On Rails 4_Filterrific - Fatal编程技术网

Ruby on rails 未定义的方法“[]';对于nil:NilClass on select_选项[Filterrific Gem]

Ruby on rails 未定义的方法“[]';对于nil:NilClass on select_选项[Filterrific Gem],ruby-on-rails,ruby-on-rails-4,filterrific,Ruby On Rails,Ruby On Rails 4,Filterrific,您好,我正在使用Filterrific Gem为我的用户页面添加搜索和过滤功能 搜索工作正常,但是当我尝试实现“排序依据”过滤时,我得到了nil:NilClass`的undefined method[]”错误 我在这里参考过滤参考文档: 这是我的密码: index.html.erb <div class="well"> <%= form_for_filterrific @filterrific do |f| %> <div>

您好,我正在使用Filterrific Gem为我的用户页面添加搜索和过滤功能

搜索工作正常,但是当我尝试实现“排序依据”过滤时,我得到了nil:NilClass`的
undefined method
[]”错误

我在这里参考过滤参考文档:

这是我的密码:

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>
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
}
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
用户\u控制器.rb

<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>
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
}
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”=>{“搜索\查询”=>“”

应该是这样的


在控制器中初始化时,“filterrific”=>{“search\u query”=>,“select\u options”=>YOUR-options}

。参数不包含选择选项。它们应包含选择选项。现在看来:

“filterrific”=>{“搜索\查询”=>“”

应该是这样的


在用户控制器中的“filterrific”=>{“search\u query”=>,“select\u options”=>YOUR-options}

您需要设置控制器以接受您的选择选项和其他需要的参数,就像在处创建的带有参数的

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
在您的用户模型中

您还需要将在控制器中调用的这些方法写入您的模型中,并且您不需要在
处使用_created_指定
,就像指定的过滤器一样,它可以在
选项中按排序,就像上面的示例一样

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\u查询
按需要工作。您可以像这样定义特定筛选器的作用域

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


在用户控制器中

您需要设置控制器以接受您的选择选项和其他需要的参数,就像在处创建的带有参数的

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
在您的用户模型中

您还需要将在控制器中调用的这些方法写入您的模型中,并且您不需要在
处使用_created_指定
,就像指定的过滤器一样,它可以在
选项中按排序,就像上面的示例一样

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\u查询
按需要工作。您可以像这样定义特定筛选器的作用域

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


@filterrific中是否有任何值。请选择\u options
?你查过了吗?@当然有。看到我更新的问题了吗。我已经包含了我的用户代码。\u controller.rbIs
@filterrific中是否有任何值。选择\u options
?你查过了吗?@当然有。看到我更新的问题了吗。我已经包括了我的用户代码_controller.rb