2011-08-24 41 views
2

我使用CodeNothing's jQuery Autocomplete插件在文本输入上启用自动完成。Ruby/Rails:响应json请求,从对象数组中创建散列数组,更改一个键的名称

的插件需要中检索JSON对象的形式:

[{ value: 'something' }, { value: 'something else' }, { value: 'another thing' }] 

所以,我的标签模型存储其名称name,不value。为了应对这种响应Ajax请求我创建了以下tags#index行动:

def index 
    @tags = Tag.where("name LIKE ?", "%#{params[:value]}%") 
    @results = Array.new 
    @tags.each do |t| 
     @results << { :value => t.name } 
    end 
    respond_to do |format| 
     format.json { render :json => @results } 
    end 
end 

这是我能想到的最好的。它的工作,但似乎cirldgey。

有没有更快或更好的方法来将name方法的标签数组转换为{ :value => tag.name }形式的哈希数组?

此外,对于奖励积分,您能否建议对此控制器操作进行任何改进?

谢谢!


注意

我结束了由Deradon的回答得到灵感,并与这个最后的实施提出了:

在我的标签模式,我说:

​​3210

在随后我的控制器我简单地称为:

def index 
    @tags = Tag.where("name LIKE ?", params[:value]+"%") 
    respond_to do |format| 
     format.js { render :json => @tags.map(&:to_value) } 
    end 
end 

不错,简短,简单。我对此感到高兴。谢谢!

回答

3

如果我不得不重构这个,我会做这种方式:

def index 
    tags = Tag.where(:name => params[:value]) 
    @results = tags.each.inject([]) do |arr, tag| 
     arr << { :value => tag.name } 
    end 
    respond_to do |format| 
     format.json { render :json => @results } 
    end 
end 

编辑:可能工作的另一种方式,但未经检验。这里没有红宝石现在

def index 
    @tags = Tag.where(:name => params[:value]) 
    @tags.collect!{ |tag| {:value => tag.name} } 
    respond_to do |format| 
     format.json { render :json => @tags } 
    end 
end 
+0

我并没有完全使用,但你给了我一个伟大的想法。请参阅原始问题的注释。谢谢您的帮助! – Andrew