get_or_build 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +15 -3
- data/lib/get_or_build/association_builder.rb +6 -6
- data/lib/get_or_build/fields_for_builder.rb +9 -2
- data/lib/get_or_build/version.rb +1 -1
- data/test/fields_for_helper_test.rb +36 -2
- data/test/support/models.rb +3 -0
- metadata +12 -12
data/README.md
CHANGED
@@ -34,10 +34,22 @@ No longer need to call `f.object.user || f.object.build_user`
|
|
34
34
|
|
35
35
|
## Using with NoSQL databases
|
36
36
|
|
37
|
-
Just include in your document module `GetOrBuild::AssociationBuilder` and it will attach
|
37
|
+
Just include in your document module `GetOrBuild::AssociationBuilder` and it will attach magic methods automatically
|
38
|
+
|
39
|
+
## Extension for fields_for method
|
40
|
+
|
41
|
+
You are able also to use option `:build_association` for `fields_for` method to build association if it doesn't exist yet:
|
42
|
+
|
43
|
+
form_for :company do |f|
|
44
|
+
f.fields_for :user, :build_association => true do |fu|
|
45
|
+
fu.text_field :name
|
46
|
+
f.fields_for :user, :build_association => true do |fl|
|
47
|
+
fl.text_field :address
|
48
|
+
|
49
|
+
If you initialize associated object user for company before run `fields_for` helper then option `:build_association` won't give any effect
|
38
50
|
|
39
51
|
## Contributing
|
40
|
-
You are welcome! Please, run test before pull request: `rake` and make sure if everything is
|
52
|
+
You are welcome! Please, run test before pull request: `rake` and make sure if everything is working correctly.
|
41
53
|
|
42
54
|
## TODO
|
43
|
-
*
|
55
|
+
* Support for NoSQL databases
|
@@ -11,12 +11,12 @@ module GetOrBuild
|
|
11
11
|
# Here the method `company_or_build` for `User` instane `u` was generated
|
12
12
|
def method_missing(method, *args)
|
13
13
|
if method =~ /(\w+)_or_build$/
|
14
|
-
if result = send($1, *args)
|
15
|
-
result
|
16
|
-
else
|
17
|
-
builder_method = "build_#{$1}"
|
18
|
-
send(builder_method, *args) if respond_to?(builder_method)
|
19
|
-
end
|
14
|
+
if result = send($1, *args) # if result = send("company", *args)
|
15
|
+
result # result
|
16
|
+
else # else
|
17
|
+
builder_method = "build_#{$1}" # builder_method = "build_company"
|
18
|
+
send(builder_method, *args) if respond_to?(builder_method) # send(builder_method, *args) if respond_to?(builder_method)
|
19
|
+
end # end
|
20
20
|
else
|
21
21
|
super
|
22
22
|
end
|
@@ -5,8 +5,15 @@ module GetOrBuild
|
|
5
5
|
def fields_for_with_association_builder(record_name, record_object = nil, fields_options = {}, &block)
|
6
6
|
fields_options, record_object = record_object, nil if record_object.is_a?(Hash) && record_object.extractable_options?
|
7
7
|
|
8
|
-
if fields_options
|
9
|
-
|
8
|
+
if fields_options.delete(:build_association)
|
9
|
+
association_name = case record_name
|
10
|
+
when String, Symbol
|
11
|
+
record_name
|
12
|
+
when Array
|
13
|
+
ActiveModel::Naming.param_key(record_name.last)
|
14
|
+
end
|
15
|
+
build_method = "build_#{association_name}"
|
16
|
+
record_object = @object.send(build_method) if !record_object && !@object.send(association_name) && @object.respond_to?(build_method)
|
10
17
|
end
|
11
18
|
|
12
19
|
fields_for_without_association_builder(record_name, record_object, fields_options, &block)
|
data/lib/get_or_build/version.rb
CHANGED
@@ -10,6 +10,7 @@ class FieldsFor < ActionView::TestCase
|
|
10
10
|
form_for company, :url => '' do |f|
|
11
11
|
f.fields_for :user, :build_association => true do |ff|
|
12
12
|
assert_not_nil ff.object
|
13
|
+
assert_not_nil ff.text_field(:name)
|
13
14
|
end
|
14
15
|
end
|
15
16
|
end
|
@@ -19,10 +20,43 @@ class FieldsFor < ActionView::TestCase
|
|
19
20
|
assert_equal company.user, nil
|
20
21
|
form_for company, :url => '' do |f|
|
21
22
|
f.fields_for :user, :build_association => false do |ff|
|
22
|
-
assert_equal ff.object
|
23
|
+
assert_equal nil, ff.object
|
24
|
+
assert_equal nil, ff.text_field(:name)
|
23
25
|
end
|
24
26
|
f.fields_for :user do |ff|
|
25
|
-
assert_equal ff.object
|
27
|
+
assert_equal nil, ff.object
|
28
|
+
assert_equal nil, ff.text_field(:name)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_for_existing_record1
|
34
|
+
company = Company.new
|
35
|
+
user = company.build_user(:name => 'Mister Proper')
|
36
|
+
form_for company, :url => '' do |f|
|
37
|
+
f.fields_for :user, :build_association => true do |ff|
|
38
|
+
assert_not_nil ff.text_field(:name)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_for_existing_record2
|
44
|
+
company = Company.new
|
45
|
+
user = company.build_user(:name => 'Mister Proper')
|
46
|
+
form_for company, :url => '' do |f|
|
47
|
+
f.fields_for :user do |ff|
|
48
|
+
assert_not_nil ff.text_field(:name)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_nested_params
|
54
|
+
company = Company.new
|
55
|
+
user = company.build_user(:name => 'New User')
|
56
|
+
form_for company, :url => '' do |f|
|
57
|
+
f.fields_for [:admin, user], :build_association => true do |ff|
|
58
|
+
assert_not_nil ff.object
|
59
|
+
assert_equal user.name, ff.object.name
|
26
60
|
end
|
27
61
|
end
|
28
62
|
end
|
data/test/support/models.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
class Company < ActiveRecord::Base
|
2
2
|
belongs_to :location
|
3
3
|
has_one :user
|
4
|
+
accepts_nested_attributes_for :user
|
5
|
+
accepts_nested_attributes_for :location
|
4
6
|
end
|
5
7
|
|
6
8
|
class User < ActiveRecord::Base
|
7
9
|
belongs_to :company
|
10
|
+
accepts_nested_attributes_for :company
|
8
11
|
end
|
9
12
|
|
10
13
|
class Location < ActiveRecord::Base; end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: get_or_build
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-25 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
|
-
requirement: &
|
16
|
+
requirement: &70327775366480 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70327775366480
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: actionpack
|
27
|
-
requirement: &
|
27
|
+
requirement: &70327775365680 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70327775365680
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: sqlite3
|
38
|
-
requirement: &
|
38
|
+
requirement: &70327775364740 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70327775364740
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
|
-
requirement: &
|
49
|
+
requirement: &70327775364040 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70327775364040
|
58
58
|
description: ! 'Assume user belongs_to company and you want to get company object
|
59
59
|
within one method call. You can do it like this: user.company_or_build'
|
60
60
|
email:
|
@@ -91,7 +91,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
91
91
|
version: '0'
|
92
92
|
segments:
|
93
93
|
- 0
|
94
|
-
hash:
|
94
|
+
hash: 2580832862823747020
|
95
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
96
|
none: false
|
97
97
|
requirements:
|
@@ -100,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
100
|
version: '0'
|
101
101
|
segments:
|
102
102
|
- 0
|
103
|
-
hash:
|
103
|
+
hash: 2580832862823747020
|
104
104
|
requirements: []
|
105
105
|
rubyforge_project: get_or_build
|
106
106
|
rubygems_version: 1.8.10
|