Ruby on rails Ruby/Rails:响应json请求,从对象数组创建哈希数组,更改键的名称

Ruby on rails Ruby/Rails:响应json请求,从对象数组创建哈希数组,更改键的名称,ruby-on-rails,ruby,ajax,ruby-on-rails-3,json,Ruby On Rails,Ruby,Ajax,Ruby On Rails 3,Json,我正在使用插件在文本输入上启用自动完成 插件需要以以下形式检索json对象: [{ value: 'something' }, { value: 'something else' }, { value: 'another thing' }] 因此,我的标记模型将其名称存储为name,而不是value。为了响应这个ajax请求,我创建了以下标记#index操作: def index @tags = Tag.where("name LIKE ?", "%#{params[:value]}%

我正在使用插件在文本输入上启用自动完成

插件需要以以下形式检索json对象:

[{ value: 'something' }, { value: 'something else' }, { value: 'another thing' }]
因此,我的标记模型将其名称存储为
name
,而不是
value
。为了响应这个ajax请求,我创建了以下
标记#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
然后在我的控制器中,我简单地调用:

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

好,短,简单。我更喜欢它。谢谢

如果我必须重构它,我会这样做:

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])
    @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