Я использую плагин 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
Хорошо, коротко, просто. Я намного счастливее с этим. Спасибо!