已更新。我原来的回答误解了这个问题。
第一个选项。
你修改你的控制器动作。
# units_controller
def autocomplete
term = params[:term]
quantity, unit = term.split(/\s/)
items = unit ? Unit.where('units.name LIKE ?',"#{unit}%") : []
json = items.collect do |item|
{ "id" => item.id.to_s,
"label" => item.name,
"value" => "#{quantity} #{item.name} "
}
end
render json: json
end
虽然自动完成行为已经正确,但此解决方案不是最理想的,因为即使在我输入数量时它也会访问服务器(并且没有给出任何结果)。
完整的解决方案涉及修补 rails 自动完成器驱动程序。
保留 abave 自定义控制器操作,只需放置一个自定义 minLength 函数
https://github.com/crowdint/rails3-jquery-autocomplete/blob/master/lib/assets/javascripts/autocomplete-rails-uncompressed.js#L63
您将此部分修改为:
search: function() {
// custom minLength
var term = extractLast( this.value );
var filter = jQuery(this).attr('data-input-filter');
if (filter != null) {
var re = new RegExp(filter,"");
term = term.replace(re, "$1"); //ignore parts of it
}
if ( term.length < 1 ) { //modify to 1
return false;
}
},
现在如果你把这个 minlength 过滤器放到你的字段标签中
'data-input-filter' => j("^.*\s+([^\s]+)$")
它将正确地忽略用户输入的第一位(直到最后一个空格之后),并且仅在您到达单位的第一个字符时才访问服务器。 (这里有点不确定逃脱)
这种方法的一个优点是您可以将成分自动完成添加到控制器中,并使用逗号并只需将此选项添加到自动完成文本字段帮助程序即可获取多种成分输入:
"data-delimiter" => ','
然后您可以正确地自动完成输入,例如:
1 kilo flour, 2 spoons sugar, 100 gramms yeast.