Ruby on rails 未定义的方法“[]';对于nil:NilClass on select_选项[Filterrific Gem]
您好,我正在使用Filterrific Gem为我的用户页面添加搜索和过滤功能 搜索工作正常,但是当我尝试实现“排序依据”过滤时,我得到了nil:NilClass`的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>
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