simple_autocomplete 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -91,6 +91,11 @@ Example for a post with autocompleted user name:
91
91
  autocomplete_for(:user, :name, :name=>:creator) #--> f.text_field :auto_creator_name (creator must a an User)
92
92
  end
93
93
 
94
+ class Group
95
+ has_many :users
96
+ add_by_autocomplete(:user, :name) #--> f.text_field :add_by_auto_user_name
97
+ end
98
+
94
99
 
95
100
  Authors
96
101
  =======
@@ -100,6 +105,7 @@ Inspired by DHH`s 'obstrusive' autocomplete_plugin.
100
105
  - [Bryan Ash](http://bryan-ash.blogspot.com)
101
106
  - [David Leal](http://github.com/david)
102
107
  - [mlessard](http://github.com/mlessard)
108
+ - [Oliver Azevedo Barnes](http://github.com/oliverbarnes)
103
109
  - [Splendeo](http://www.splendeo.es)
104
110
 
105
111
  [Michael Grosser](http://pragmatig.wordpress.com)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.5
1
+ 0.3.6
@@ -31,23 +31,14 @@ class ActionController::Base
31
31
  end
32
32
  end
33
33
 
34
- # Store the value of the autocomplete field as association
35
- # autocomplete_for('user','name')
36
- # -> the auto_user_name field will be resolved to a User, using User.find_by_autocomplete_name(value)
37
- # -> Post has autocomplete_for('user','name')
38
- # -> User has find_by_autocomplete('name')
39
- # see Readme for more details
40
34
  class ActiveRecord::Base
35
+ # Store autocomplete field as association
36
+ # in post.rb: autocomplete_for('user', 'name')
37
+ # in user.rb add find_by_autocomplete :name
38
+ # Post.first.auto_user_name=(value) will be resolved to a User, using User.find_by_autocomplete_name(value)
41
39
  def self.autocomplete_for(model, attribute, options={})
42
- name = options[:name] || model.to_s.underscore
43
- name = name.to_s
44
- model = model.to_s.camelize.constantize
45
-
46
- # is the correct finder defined <-> warn users
47
- finder = "find_by_autocomplete_#{attribute}"
48
- unless model.respond_to? finder
49
- raise "#{model} does not respond to #{finder}, maybe you forgot to add auto_complete_for(:#{attribute}) to #{model}?"
50
- end
40
+ model, name = autocomplete_model_and_name(model, options[:name])
41
+ finder = autocomplete_finder_for(model, attribute)
51
42
 
52
43
  #auto_user_name= "Hans"
53
44
  define_method "auto_#{name}_#{attribute}=" do |value|
@@ -60,11 +51,46 @@ class ActiveRecord::Base
60
51
  end
61
52
  end
62
53
 
63
- def self.find_by_autocomplete(attr)
54
+ # Add association by autocomplete field
55
+ # in post.rb add_by_autocomplete('user', 'name) for has_many() association, like on github's collaborators search
56
+ # in user.rb add find_by_autocomplete :name
57
+ # Post.first.add_bu_auto_user_name=(value) will be resolved to a User, using User.find_by_autocomplete_name(value)
58
+ def self.add_by_autocomplete(model, attribute, options={})
59
+ model, name = autocomplete_model_and_name(model, options[:name])
60
+ finder = autocomplete_finder_for(model, attribute)
61
+
62
+ #add_user_by_autocomplete= "Hans"
63
+ define_method "add_by_auto_#{name}_#{attribute}=" do |value|
64
+ send(name.pluralize).send('<<', model.send(finder, value)) if value and !value.empty?
65
+ end
66
+
67
+ # avoid method missing error when rendering a form field
68
+ define_method("add_by_auto_#{name}_#{attribute}"){}
69
+ end
70
+
71
+ def self.find_by_autocomplete(attribute)
64
72
  metaclass = (class << self; self; end)
65
- metaclass.send(:define_method, "find_by_autocomplete_#{attr}") do |value|
73
+ metaclass.send(:define_method, "find_by_autocomplete_#{attribute}") do |value|
66
74
  return if value.blank?
67
- self.first(:conditions => [ "LOWER(#{attr}) = ?", value.to_s.downcase ])
75
+ self.first(:conditions => [ "LOWER(#{attribute}) = ?", value.to_s.downcase ])
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ def self.autocomplete_model_and_name(model, name)
82
+ name = name || model.to_s.underscore
83
+ name = name.to_s
84
+ model = model.to_s.camelize.constantize
85
+ [model, name]
86
+ end
87
+
88
+ # is the correct finder defined <-> warn users
89
+ def self.autocomplete_finder_for(model, attribute)
90
+ finder = "find_by_autocomplete_#{attribute}"
91
+ unless model.respond_to? finder
92
+ raise "#{model} does not respond to #{finder}, maybe you forgot to add auto_complete_for(:#{attribute}) to #{model}?"
68
93
  end
94
+ finder
69
95
  end
70
96
  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.5"
8
+ s.version = "0.3.6"
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-12}
12
+ s.date = %q{2010-06-28}
13
13
  s.email = %q{grosser.michael@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.markdown"
@@ -18,6 +18,11 @@ ActiveRecord::Schema.define(:version => 1) do
18
18
  create_table :posts do |t|
19
19
  t.integer :author_id
20
20
  end
21
+
22
+ create_table :tags do |t|
23
+ t.integer :post_id
24
+ t.string :name
25
+ end
21
26
  end
22
27
 
23
28
  class User < ActiveRecord::Base
@@ -28,7 +33,14 @@ class Author < ActiveRecord::Base
28
33
  find_by_autocomplete :name
29
34
  end
30
35
 
36
+ class Tag < ActiveRecord::Base
37
+ belongs_to :post
38
+ find_by_autocomplete :name
39
+ end
40
+
31
41
  class Post < ActiveRecord::Base
32
42
  belongs_to :author
43
+ has_many :tags
33
44
  autocomplete_for :author, :name
45
+ add_by_autocomplete :tag, :name
34
46
  end
@@ -1,3 +1,4 @@
1
+
1
2
  require "spec/spec_helper"
2
3
 
3
4
  describe SimpleAutocomplete do
@@ -176,4 +177,34 @@ describe 'Model extensions' do
176
177
  Author.find_by_autocomplete_name('bob').should == nil
177
178
  end
178
179
  end
180
+
181
+ describe "add_by_auto_{name}_{attribute}" do
182
+ it "is always nil when associated is not present" do
183
+ Post.new.add_by_auto_tag_name.should == nil
184
+ end
185
+ end
186
+
187
+ describe "add_by_auto_{name}_{attribute}=" do
188
+ before do
189
+ Tag.delete_all
190
+ Tag.create!(:name => 'economics')
191
+ @tag = Tag.create!(:name => 'politics')
192
+ Tag.create!(:name => '')
193
+ end
194
+
195
+ it "does nothing when blank is set" do
196
+ p = Post.new(:add_by_auto_tag_name => '' )
197
+ p.tags.should be_empty
198
+ end
199
+
200
+ it "does nothing when nil is net" do
201
+ p = Post.new(:add_by_auto_tag_name => nil)
202
+ p.tags.should be_empty
203
+ end
204
+
205
+ it "finds the correct associated and sets it" do
206
+ p = Post.new(:add_by_auto_tag_name => 'politics')
207
+ p.tags.should == [@tag]
208
+ end
209
+ end
179
210
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 5
9
- version: 0.3.5
8
+ - 6
9
+ version: 0.3.6
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-12 00:00:00 +02:00
17
+ date: 2010-06-28 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies: []
20
20