simple_autocomplete 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -29,11 +29,17 @@ and sorts by the autocomplete field.
29
29
  `autocomplete_for` takes a third parameter, an options hash which is used in the find:
30
30
 
31
31
  autocomplete_for :user, :name, :limit => 15, :order => 'created_at DESC'
32
-
33
- With a block you can generate any output you need (passed into render :inline):
32
+
33
+ With :match option you can filter for different columns
34
+
35
+ # find and order with firstname/lastname
36
+ # return full_name of records for auto-completion
37
+ autocomplete_for :user, :full_name, :match => [:firstname, :lastname]
38
+
39
+ With a block you can generate any output you need (ERB allowed):
34
40
 
35
41
  autocomplete_for :post, :title do |items|
36
- items.map{|item| "#{item.title} -- #{item.id}"}.join("\n")
42
+ items.map{|item| "#{item.title} -- #{item.id} <%= Time.now %>"}.join("\n")
37
43
  end
38
44
 
39
45
  The items passed into the block is an ActiveRecord scope allowing further scopes to be chained:
@@ -91,8 +97,9 @@ Authors
91
97
  Inspired by DHH`s 'obstrusive' autocomplete_plugin.
92
98
 
93
99
  ###Contributors (alphabetical)
94
- - [Bryan Ash](http://bryan-ash.blogspot.com/)
100
+ - [Bryan Ash](http://bryan-ash.blogspot.com)
95
101
  - [David Leal](http://github.com/david)
102
+ - [mlessard](http://github.com/mlessard)
96
103
  - [Splendeo](http://www.splendeo.es)
97
104
 
98
105
  [Michael Grosser](http://pragmatig.wordpress.com)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.3
1
+ 0.3.5
@@ -2,40 +2,20 @@ module SimpleAutocomplete
2
2
  VERSION = File.read( File.join(File.dirname(__FILE__),'..','VERSION') ).strip
3
3
  end
4
4
 
5
- #Example:
6
- #
7
- # # Controller
8
- # class BlogController < ApplicationController
9
- # autocomplete_for :post, :title
10
- # end
11
- #
12
- # # View
13
- # <%= text_field :post, title, :class => 'autocomplete', 'data-autocomplete-url'=>autocomplete_for_post_title_posts_path %>
14
- #
15
- # #routes.rb
16
- # map.resources :users, :collection => { :autocomplete_for_user_name => :get}
17
- #
18
- # # Options
19
- # By default, autocomplete_for limits the results to 10 entries,
20
- # and sorts by the given field.
21
- #
22
- # autocomplete_for takes a third parameter, an options hash to
23
- # the find method used to search for the records:
24
- #
25
- # autocomplete_for :post, :title, :limit => 15, :order => 'created_at DESC'
26
- #
27
- # # Block
28
- # with a block you can generate any output you need(passed into render :inline):
29
- # autocomplete_for :post, :title do |items|
30
- # items.map{|item| "#{item.title} -- #{item.id}"}.join("\n")
31
- # end
5
+ # see Readme for details
32
6
  class ActionController::Base
33
7
  def self.autocomplete_for(object, method, options = {}, &block)
8
+ options = options.dup
34
9
  define_method("autocomplete_for_#{object}_#{method}") do
10
+ methods = options.delete(:match) || [*method]
11
+ condition = methods.map{|m| "LOWER(#{m}) LIKE ?"} * " OR "
12
+ values = methods.map{|m| "%#{params[:q].to_s.downcase}%"}
13
+ conditions = [condition, *values]
14
+
35
15
  model = object.to_s.camelize.constantize
36
16
  find_options = {
37
- :conditions => [ "LOWER(#{method}) LIKE ?", '%'+params[:q].to_s.downcase + '%' ],
38
- :order => "#{method} ASC",
17
+ :conditions => conditions,
18
+ :order => "#{methods.first} ASC",
39
19
  :limit => 10
40
20
  }.merge!(options)
41
21
 
@@ -44,7 +24,7 @@ class ActionController::Base
44
24
  out = if block_given?
45
25
  instance_exec @items, &block
46
26
  else
47
- %Q[<%= @items.map {|item| h(item.#{method})}.uniq.join("\n")%>]
27
+ %Q[<%= @items.map {|item| h(item.#{methods.first})}.uniq.join("\n")%>]
48
28
  end
49
29
  render :inline => out
50
30
  end
@@ -56,6 +36,7 @@ end
56
36
  # -> the auto_user_name field will be resolved to a User, using User.find_by_autocomplete_name(value)
57
37
  # -> Post has autocomplete_for('user','name')
58
38
  # -> User has find_by_autocomplete('name')
39
+ # see Readme for more details
59
40
  class ActiveRecord::Base
60
41
  def self.autocomplete_for(model, attribute, options={})
61
42
  name = options[:name] || model.to_s.underscore
@@ -86,4 +67,4 @@ class ActiveRecord::Base
86
67
  self.first(:conditions => [ "LOWER(#{attr}) = ?", value.to_s.downcase ])
87
68
  end
88
69
  end
89
- end
70
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{simple_autocomplete}
8
- s.version = "0.3.4"
8
+ s.version = "0.3.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Michael Grosser"]
12
- s.date = %q{2010-05-08}
12
+ s.date = %q{2010-05-12}
13
13
  s.email = %q{grosser.michael@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.markdown"
@@ -24,11 +24,7 @@ describe 'Controller extensions' do
24
24
  class UserAddress < ActiveRecord::Base
25
25
  set_table_name :users
26
26
  end
27
-
28
- UserAddress.should_receive(:scoped).with do |options|
29
- options[:conditions] == ['LOWER(full_name) LIKE ?','%hans%']
30
- end
31
-
27
+ UserAddress.should_receive(:scoped).with hash_including(:conditions => ['LOWER(full_name) LIKE ?','%hans%'])
32
28
  @c.stub!(:params).and_return :q=>'Hans'
33
29
  UsersController.autocomplete_for(:user_address,:full_name)
34
30
  @c.autocomplete_for_user_address_full_name
@@ -56,6 +52,28 @@ describe 'Controller extensions' do
56
52
  @c.autocomplete_for_user_name
57
53
  end
58
54
  end
55
+
56
+ describe "autocomplete with :match" do
57
+ before do
58
+ UsersController.autocomplete_for(:user, :name, :match => [:full_name, :name])
59
+ end
60
+
61
+ it "renders the items inline with method" do
62
+ @c.should_receive(:render).with {|hash| hash[:inline] =~ /@items.map \{|item| h(item.full_name)\}.uniq.join(\'\n\')/}
63
+ @c.autocomplete_for_user_name(:match => [:full_name, :name])
64
+ end
65
+
66
+ it "orders ASC by match" do
67
+ User.should_receive(:scoped).with(hash_including(:order => 'full_name ASC'))
68
+ @c.autocomplete_for_user_name(:match => [:full_name, :name])
69
+ end
70
+
71
+ it "finds by match" do
72
+ @c.stub!(:params).and_return :q=>'Hans'
73
+ User.should_receive(:scoped).with(hash_including(:conditions => ["LOWER(full_name) LIKE ? OR LOWER(name) LIKE ?", "%hans%", "%hans%"]))
74
+ @c.autocomplete_for_user_name(:match => [:full_name, :name])
75
+ end
76
+ end
59
77
 
60
78
  describe "autocomplete using blocks" do
61
79
  it "evaluates the block" do
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 4
9
- version: 0.3.4
8
+ - 5
9
+ version: 0.3.5
10
10
  platform: ruby
11
11
  authors:
12
12
  - Michael Grosser
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-08 00:00:00 +02:00
17
+ date: 2010-05-12 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies: []
20
20