由AJAX填充的simple_form选择集合

时间:2014-04-22 20:13:45

标签: ruby-on-rails ajax simple-form

我认为这很容易,但我没有找到Googling的任何帮助 我有一个表单(simple_form),其中包含从数据库中填充的选择列表(集合)的众多输入,因此很多都会减慢初始页面加载速度。我认为只有在用户使用Ajax选择它们时才填充下拉列表,我可以加快速度。是否有像remote => true这样的内容为表单本身?有人能指出我正确的方向吗?

修改 我找到了SO question,但我无法弄清楚如何实现答案 目前,我的表单看起来像这样;

= simple_form_for(@account)
  = f.input :account_number
  = f.input :area, collection: @areas 
  = f.submit nil, :class => 'btn btn-primary'

基于相关问题的答案,我应该添加这样的内容,但当然不起作用

= simple_form_for(@account)
  = f.input :account_number
  = f.input :area, collection: @areas, :input_html => {"data-remote" => true, "data-url" => "/my_areas", "data-type" => :json}      
  = f.submit nil, :class => 'btn btn-primary'

2 个答案:

答案 0 :(得分:3)

如果您不希望在页面加载时最初加载内容,我可以考虑两种方法。一种方法是在加载DOM后运行脚本以更改select标记的选项,另一种方法是在单击select元素上的下拉列表时收集选项。我可能会采用第一种方式,因为当用户点击select元素时不会有延迟 - 他们不必等待填充选项。

所以你在文档就绪上运行一个jQuery脚本,它对你控制器中的一个方法进行AJAX调用,然后返回你想要的集合,然后用JQuery脚本迭代你想要改变的select元素。它可能看起来像这样。

# in view with the select options to be changed
$(document).ready(function() {
  $.get(change_selects_path, function(response) {
    $.each(response, function(args) {
      // code for each select element to be changed
      $('.class_of_select_element').html(<%= j options_from_collection_for_select(args) %>);
    });  
  });
)};

# in controller
def change_selects
  # make db calls and store in variables to feed to $.get request
end

请注意,这未经过测试,但应该为您提供一个良好的解决方案。有关每个循环的更多信息,您可以查看this documentation

答案 1 :(得分:1)

不确定这是否适合您的确切用例(如果没有,请澄清),但我也有一些收集选择,其后面有大量的数据库行。我使用select2-rails gem来处理这个问题。用户可以开始输入名称,相关结果会显示出来(如果他们没有输入内容,最初也会显示一些)。

请在此处查看:https://github.com/argerim/select2-rails

编辑:对于级联下拉列表,我推荐此gem:https://github.com/ryanb/nested_form