0

我正在尝试在 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) 

该代码仅发送每个食物对象的名称属性。我需要它来发送名称和类型,以使 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   

食品.js

$(function() {

  $( "#search_food_text_field" ).catcomplete({
    source: $("#search_food_text_field").data('catcomplete-source')
  });

});  

我很感激任何帮助。谢谢

4

3 回答 3

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 
于 2013-04-10T03:42:30.783 回答
1

如果您渲染为 json,它将只需要一个 json 对象,而不是数组。采用:

render text: @foods.map{|t| {name: t.name, type: t.type}}
于 2013-04-10T08:26:15.370 回答
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":"样品食品"}]

于 2013-04-10T14:24:42.387 回答