Ruby / Rails: ответ на запрос json, создание массива хешей из массива объектов, изменение имени ключа - PullRequest
2 голосов
/ 25 августа 2011

Я использую плагин CodeNothing для jQuery Autocomplete , чтобы включить автозаполнение при вводе текста.

Плагин должен получить объект json в виде:

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

Итак, моя модель Tag сохраняет свое имя как 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

Это лучшее, что я мог придумать. Это работает, но кажется грязным.

Есть ли более быстрый или лучший способ преобразовать массив тегов с методом name в массив хэшей с формой { :value => tag.name }?

Также, для бонусных баллов, можете ли вы предложить какие-либо улучшения для этого действия контроллера?

Спасибо!


Примечание

Я был вдохновлен ответом Дерадона и придумал окончательную реализацию:

В моей модели тегов я добавил:

def to_value
    { :value => name }
end

Тогда в моем контроллере я просто позвонил:

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

Хорошо, коротко, просто. Я намного счастливее с этим. Спасибо!

1 Ответ

3 голосов
/ 25 августа 2011

Если бы мне пришлось провести рефакторинг, я бы сделал это следующим образом:

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

edit: другой способ, который может работать, но не проверен.Здесь нет рубинов

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...