我有几个用户可以应用于搜索的过滤器:
当用户检查语言并单击过滤器时,会对我的搜索操作发出POST请求:
def search
index
render :index
end
使用我的索引操作:
def index
@q = Listing.search(search_params)
@listings = @q.result(distinct: true).page(params[:page])
end
@q
由Ransack Gem设置,等于表单提交的参数:
q {"languages_id_eq_any":["1"]} #this would be the param if 'French' was selected
显示匹配的对象(在我的例子中,类Listing
的对象)。
刷新页面时,搜索结果会被适当过滤,但我的搜索表单都未经过检查。
如果用户按English
过滤,我希望在显示搜索结果后检查English
语言选项(以便用户记住他们使用的过滤器)。
我该怎么做?
我知道我可以通过更改表单代码来“检查”复选框(请参阅下面的完整表单代码):
= check_box_tag('q[languages_id_eq_any][]', language.id )
到
= check_box_tag('q[languages_id_eq_any][]', language.id, checked: true )
但我不确定如何在此处获取搜索参数信息 - 或者这是否是最有效的方向(在整个表单中手动设置每个值)。
以下是表单的代码:
= simple_form_for @q, url: search_listings_path,
html: { method: :post } do |f|
- Language.all.each do |language|
= check_box_tag('q[languages_id_eq_any][]', language.id )
= language.name
= f.button :submit, 'Filter'
在下面的Toolz'回答后更新:
它仍然不是完美的(两个帮助者在一个而不是一个包罗万象的帮助者,但我将一些长线提取到帮助者中:
def filtered_checkbox_value_by_index(name, index)
symbol = "#{name}_id_eq_any".to_sym
unless params[:q].nil? || params[:q][symbol].nil?
params[:q][symbol].include?((index+1).to_s)
end
end
所以我的复选框代码变为:
- Language.all.each_with_index do |language, index|
= check_box_tag('q[languages_id_eq_any][]', language.id, filtered_checkbox_value_by_index('languages', index))
= language.name
= f.button :submit, 'Filter'
答案 0 :(得分:1)
变化
- Language.all.each do |language|
= check_box_tag('q[languages_id_eq_any][]', language.id )
到
- Language.all.each_with_index do |language, index|
= check_box_tag('q[languages_id_eq_any][]', language.id, params[:q][:languages_id_eq_any].include?((index+1).to_s))