如何根据高级模式中的属性限制Ransack gem的可搜索选项?

时间:2015-12-21 21:12:59

标签: javascript jquery ruby-on-rails ruby ransack

我正在使用Ransack gem为我的用户创建搜索表单。我选择使用他们在文档中提到的“高级”选项(here),页面列出了一组属性,谓词的下拉列表(<,>,==,等)和用于指定值的文本框。然后,用户可以根据需要添加更多条件。我的问题是,如何根据用户选择的属性设置值框?

例如,如果他们选择搜索模型的age属性,我想给他们一个0到125或类似的下拉列表。

我计划使用jquery来确定用户选择的值,然后根据所选内容修改值框,但我不确定如何识别表单选择框来执行此操作。它包含随机生成的值,例如...... <select class="form-control" name="q[c][1450731292853][a][0][name]" id="q_c_1450731292853_a_0_name">

编辑:忘了这里是我的链接,它添加了一组新条件供搜索...

  def link_to_add_fields(name, f, type)
    new_object = f.object.send "build_#{type}"
    id = "new_#{type}"
    fields = f.send("#{type}_fields", new_object, child_index: id) do |builder|
      render(type.to_s + "_fields", f: builder)
    end
    link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")})
  end

1 个答案:

答案 0 :(得分:0)

我设法通过执行以下操作解决了我的问题。如果你使用ransack,这个代码应该很好地适应“开箱即用”。如果你不使用 coffeescript ,我很抱歉。

attributes_for_true_false_select = [
  'married'
  'dog owner'
]

attributes_for_only_string = [
  'first name'
  'last name'
]

jQuery ->
  $('select[name$="[name]"]').on 'change', ->
  name_string = $(this).attr 'id'
  selected_value = $("option:selected", this).text().toLowerCase()
  value_id = $(this).attr('id').replace('name', 'value')
  value_id = value_id.replace('a','v')

  # if the selected value is for true/false control then...
  if attributes_for_true_false_select.indexOf(selected_value) > -1

  # Find the value box and change to a drop down for true/false
  true_false_drop_down_list = '<select class="form-control" name="' + $('input[id=\''+value_id+'\']').attr('name') + '" id="' + ' $('input[id=\''+value_id+'\']').attr('id') + '"><option value="1">True</option><option value="0">False</option></select>'
  $('#'+value_id).replaceWith(true_false_drop_down_list)

  # if the selected value is for string control then...
  else if attributes_for_only_string.indexOf(selected_value) > -1

  # Find the value box and change to a text input box
  text_box_control = '<input class="form-control" type="text" name="' + $('input[id=\''+value_id+'\']').attr('name') + '" id="' + $('input[id=\''+value_id+'\']').attr('id') + '">'
  $('#' + value_id).replaceWith(text_box_control)

 return