让catcomplete在rails中工作

时间:2013-04-09 21:07:59

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2

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

});  

我感谢任何帮助。感谢

3 个答案:

答案 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”}]