-
Notifications
You must be signed in to change notification settings - Fork 367
/
rails3-jquery-autocomplete.rb
51 lines (46 loc) · 1.47 KB
/
rails3-jquery-autocomplete.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
module Rails3JQueryAutocomplete
def self.included(base)
base.extend(ClassMethods)
end
# Inspired on DHH's autocomplete plugin
#
# Usage:
#
# class ProductsController < Admin::BaseController
# autocomplete :brand, :name
# end
#
# This will magically generate an action autocomplete_brand_name, so,
# don't forget to add it on your routes file
#
# resources :products do
# get :autocomplete_brand_name, :on => :collection
# end
#
# Now, on your view, all you have to do is have a text field like:
#
# f.text_field :brand_name, :autocomplete => autocomplete_brand_name_products_path
#
#
module ClassMethods
def autocomplete(object, method, options = {})
limit = options[:limit] || 10
order = options[:order] || "#{method} ASC"
define_method("autocomplete_#{object}_#{method}") do
unless params[:term] && params[:term].empty?
items = object.to_s.camelize.constantize.where(["LOWER(#{method}) LIKE ?", "#{(options[:full] ? '%' : '')}#{params[:term].downcase}%"]).limit(limit).order(order)
else
items = {}
end
render :json => json_for_autocomplete(items, (options[:display_value] ? options[:display_value] : method))
end
end
end
private
def json_for_autocomplete(items, method)
items.collect {|i| {"id" => i.id, "label" => i.send(method), "value" => i.send(method)}}
end
end
class ActionController::Base
include Rails3JQueryAutocomplete
end