Per implementare all’interno di una casella di testo una ricerca rapida su un set di campi di uno specifico modello, senza troppo curarsi di come creare un’azione ad hoc che fornisca un feed json che mostri i dati ricercati, la gemma rails3-jquery-autocomplete ci viene incontro.
Supponiamo di avere un modello User con gli attributi first_name e last_name e di volere recuperare tutti gli utenti che hanno nel proprio first_name o last_name alcuni specifici caratteri digitati nella casella di testo.
Installiamo la gemma e generiamo i file js
Installazione rails3-jquery-autocomplete
gem ‘rails3-jquery-autocomplete’
bundle install
rails g autocomplete:install
Includiamo JQuery, JQueryUI e il plugin per l’autocopletamento
app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require autocomplete-rails
Aggiungiamo il metodo full_name al modello User ed aggiungiamo un metodo di classe che ci permette di eseguire query sull’oggetto User attraverso la direttiva scope
app/models/user.rb
def full_name
"#{self.first_name} #{self.last_name}"
end scope :search_full_name, lambda {|q| where(["first_name LIKE ? or last_name LIKE ?", ‘%’+ q + ‘%’, ‘%’+ q + ‘%’ ]) }
Aggiungiamo l’azione per recuperare i vari utenti al controller
app/controllers/users_controller.rb
class FriendshipsController < ApplicationController
autocomplete :user, :first_name, :display_value => :full_name, :extra_data => [:last_name, :first_name]
end
Questo crea un azione chiamata autocomplete_user_first_name all’interno del controller e non dimentichiamoci di aggiungerlo nel file di routes
config/routes.rb
resources :users do
get :autocomplete_user_first_name, :on => :collection
end
Dobbiamo sovrascrivere l’azione get_autocomplete_items in quanto di default ritorna l’attributo name del modello che non è presente in questo caso, così facendo verrà ritornato un valore personalizzabile
app/controllers/users_controller.rb
def get_autocomplete_items(parameters)
items=User.search_full_name(params[:term])
end
Così facendo andiamo a richiamare il metodo di classe search_full_name passandogli i caratteri digitati dall’utente che sono contenuti in params[:term]
p. Non ci resta che andare ad inserire nella view, dove preferite, il form per eseguire la ricerca
app/views/yourview.html.haml
=form_tag users_path, :method => ‘GET’, :class => ‘form-item-be form-search’ do |f|
=label_tag t(:search_by_name)
=autocomplete_field_tag ‘user[first_name]’, ‘’, autocomplete_user_first_name_friendships_path
=submit_tag t(:search)
Il form viene inviato all’azione index del controller Users, a questo punto non vi resta che filtrare i risultati e mostrarli all’utente.