我正在尝试在jquery中实现自动完成的类别版本。
这是我需要重新创建并传递给我的视图的数组类型:
var data = [
{ label: "anders", category: "" },
{ label: "andreas", category: "" },
{ label: "antal", category: "" },
{ label: "annhhx10", category: "Products" },
{ label: "annk K12", category: "Products" },
{ label: "annttop C13", category: "Products" },
{ label: "anders andersson", category: "People" },
{ label: "andreas andersson", category: "People" },
{ label: "andreas johnson", category: "People" }
];
目前,我的控制器从数据库中取出所有食物并创建一个新数组,该数组只包含原始数组中对象的一个属性。
我需要在这个新创建的数组中获取多个属性......
这是我控制器中的样子:
@foods = Food.order(:name).where("name like ?", "%#{params[:term]}%")
render json: @foods.map(&:name)
该代码仅发送每个食物对象的name属性。我需要它发送名称和类型,以使jquerys catcomplete工作。
我该怎么做?
我尝试在irb中使用以下部分来查看结果(没有@ obv):
@foods.map(&:name) is the same as @foods.map do {|t| t.name}
@foods.map do |t|
t.name
t.type
end
@foods.collect do |t|
@foods.each_slice(2).map {|name, type| Array.new(name, type)}
@foods.each_slice(2).map {|n, t| n.name, t.type }
@foods.map do |t|
@foods.map do |i|
i.name
end
@foods.map do |p|
p.name
end
end
可能还有十几种其他变种......
以下是我如何传递数组:
查看:
<%= text_field_tag 'search_food_text_field', nil, data: { catcomplete_source: search_foods_path } %>
Foods_Controller
def search
@foods = Food.order(:name).where("name like ?", "%#{params[:term]}%")
render json: @foods.map do |food|
{name: food.name, type: food.type }
end
end
foods.js
$(function() {
$( "#search_food_text_field" ).catcomplete({
source: $("#search_food_text_field").data('catcomplete-source')
});
});
我感谢任何帮助。感谢
答案 0 :(得分:1)
我认为
@foods.map do |food|
{ name: food.name, type: food.type }
end
是你想要的。这会将数组的每个值映射到散列,因此最终得到一个散列数组,每个散列都包含名称和类型。
def search
@foods = Food.order(:name).where("name like ?", "%#{params[:term]}%").all
@foods_catcomplete = @foods.map do |food|
{ name: food.name, type: food.type }
end
render json: @foods_catcomplete
end
答案 1 :(得分:1)
如果你渲染为json,它只需要一个json对象,而不是数组。使用:
render text: @foods.map{|t| {name: t.name, type: t.type}}
答案 2 :(得分:0)
感谢Logan Serman和Eru的帮助,我能够解决这个问题。
Jquery正在寻找“标签”和“类型”,我提供“名称”和“类型”,这就是文本字段只显示类型的原因。
这让它发挥作用。
def search
@foods = Food.order(:name).where("name like ?", "%#{params[:term]}%")
render json: @foods.map{|t| {type: t.type, label: t.name}}
end
如果有人想知道......这就是json输出的样子:
[{“type”:“MealFood”,“label”:“Sample Food”}]