如何使用之前搜索的详细信息自动填写Ransack搜索表单?

时间:2014-07-07 18:00:59

标签: ruby-on-rails session ruby-on-rails-4 parameters ransack

我有几个用户可以应用于搜索的过滤器:

enter image description here

当用户检查语言并单击过滤器时,会对我的搜索操作发出POST请求:

def search
  index
  render :index
end

使用我的索引操作:

def index
  @q = Listing.search(search_params)
  @listings = @q.result(distinct: true).page(params[:page])
end

@qRansack 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'

1 个答案:

答案 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))