我认为这很容易,但我没有找到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'
答案 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