cocoon 1.1.2 → 1.2.0
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/.travis.yml +8 -4
- data/Gemfile +7 -5
- data/Gemfile.lock +152 -0
- data/History.md +5 -0
- data/README.markdown +149 -168
- data/VERSION +1 -1
- data/cocoon.gemspec +28 -19
- data/gemfiles/Gemfile.rails-3.2.13 +21 -0
- data/gemfiles/Gemfile.rails-3.2.13.lock +154 -0
- data/lib/cocoon.rb +3 -1
- data/lib/cocoon/view_helpers.rb +4 -0
- data/spec/cocoon_spec.rb +174 -91
- data/spec/dummy/app/models/comment.rb +3 -1
- data/spec/dummy/app/models/post.rb +5 -1
- data/spec/dummy/config/environments/development.rb +1 -1
- data/spec/dummy/config/initializers/rails_version_helper.rb +6 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -6
- data/spec/support/rails_version_helper.rb +3 -0
- data/spec/support/shared_examples.rb +73 -0
- metadata +76 -54
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
data/cocoon.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "cocoon"
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Nathan Van der Auwera"]
|
12
|
-
s.date = "2013-
|
12
|
+
s.date = "2013-07-10"
|
13
13
|
s.description = "Unobtrusive nested forms handling, using jQuery. Use this and discover cocoon-heaven."
|
14
14
|
s.email = "nathan@dixis.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.files = [
|
19
19
|
".travis.yml",
|
20
20
|
"Gemfile",
|
21
|
+
"Gemfile.lock",
|
21
22
|
"History.md",
|
22
23
|
"MIT-LICENSE",
|
23
24
|
"README.markdown",
|
@@ -25,6 +26,8 @@ Gem::Specification.new do |s|
|
|
25
26
|
"VERSION",
|
26
27
|
"app/assets/javascripts/cocoon.js",
|
27
28
|
"cocoon.gemspec",
|
29
|
+
"gemfiles/Gemfile.rails-3.2.13",
|
30
|
+
"gemfiles/Gemfile.rails-3.2.13.lock",
|
28
31
|
"lib/cocoon.rb",
|
29
32
|
"lib/cocoon/view_helpers.rb",
|
30
33
|
"lib/generators/cocoon/install/install_generator.rb",
|
@@ -48,6 +51,7 @@ Gem::Specification.new do |s|
|
|
48
51
|
"spec/dummy/config/initializers/backtrace_silencers.rb",
|
49
52
|
"spec/dummy/config/initializers/inflections.rb",
|
50
53
|
"spec/dummy/config/initializers/mime_types.rb",
|
54
|
+
"spec/dummy/config/initializers/rails_version_helper.rb",
|
51
55
|
"spec/dummy/config/initializers/secret_token.rb",
|
52
56
|
"spec/dummy/config/initializers/session_store.rb",
|
53
57
|
"spec/dummy/config/locales/en.yml",
|
@@ -70,48 +74,53 @@ Gem::Specification.new do |s|
|
|
70
74
|
"spec/dummy/script/rails",
|
71
75
|
"spec/generators/install_generator_spec.rb",
|
72
76
|
"spec/integration/navigation_spec.rb",
|
73
|
-
"spec/spec_helper.rb"
|
77
|
+
"spec/spec_helper.rb",
|
78
|
+
"spec/support/rails_version_helper.rb",
|
79
|
+
"spec/support/shared_examples.rb"
|
74
80
|
]
|
75
81
|
s.homepage = "http://github.com/nathanvda/cocoon"
|
76
82
|
s.require_paths = ["lib"]
|
77
|
-
s.rubygems_version = "1.8.
|
83
|
+
s.rubygems_version = "1.8.25"
|
78
84
|
s.summary = "gem that enables easier nested forms with standard forms, formtastic and simple-form"
|
79
85
|
|
80
86
|
if s.respond_to? :specification_version then
|
81
87
|
s.specification_version = 3
|
82
88
|
|
83
89
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
84
|
-
s.add_development_dependency(%q<rails>, [">=
|
85
|
-
s.add_development_dependency(%q<sqlite3
|
90
|
+
s.add_development_dependency(%q<rails>, [">= 4.0.0"])
|
91
|
+
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
86
92
|
s.add_development_dependency(%q<json_pure>, [">= 0"])
|
87
93
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
88
|
-
s.add_development_dependency(%q<rspec-rails>, [">= 2.
|
89
|
-
s.add_development_dependency(%q<rspec>, [">= 2.
|
90
|
-
s.add_development_dependency(%q<actionpack>, [">=
|
94
|
+
s.add_development_dependency(%q<rspec-rails>, [">= 2.8.0"])
|
95
|
+
s.add_development_dependency(%q<rspec>, [">= 2.8.0"])
|
96
|
+
s.add_development_dependency(%q<actionpack>, [">= 4.0.0"])
|
91
97
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
98
|
+
s.add_development_dependency(%q<nokogiri>, [">= 0"])
|
92
99
|
s.add_development_dependency(%q<generator_spec>, [">= 0"])
|
93
100
|
s.add_development_dependency(%q<rspec>, [">= 2.0.0"])
|
94
101
|
else
|
95
|
-
s.add_dependency(%q<rails>, [">=
|
96
|
-
s.add_dependency(%q<sqlite3
|
102
|
+
s.add_dependency(%q<rails>, [">= 4.0.0"])
|
103
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
97
104
|
s.add_dependency(%q<json_pure>, [">= 0"])
|
98
105
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
99
|
-
s.add_dependency(%q<rspec-rails>, [">= 2.
|
100
|
-
s.add_dependency(%q<rspec>, [">= 2.
|
101
|
-
s.add_dependency(%q<actionpack>, [">=
|
106
|
+
s.add_dependency(%q<rspec-rails>, [">= 2.8.0"])
|
107
|
+
s.add_dependency(%q<rspec>, [">= 2.8.0"])
|
108
|
+
s.add_dependency(%q<actionpack>, [">= 4.0.0"])
|
102
109
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
110
|
+
s.add_dependency(%q<nokogiri>, [">= 0"])
|
103
111
|
s.add_dependency(%q<generator_spec>, [">= 0"])
|
104
112
|
s.add_dependency(%q<rspec>, [">= 2.0.0"])
|
105
113
|
end
|
106
114
|
else
|
107
|
-
s.add_dependency(%q<rails>, [">=
|
108
|
-
s.add_dependency(%q<sqlite3
|
115
|
+
s.add_dependency(%q<rails>, [">= 4.0.0"])
|
116
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
109
117
|
s.add_dependency(%q<json_pure>, [">= 0"])
|
110
118
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
111
|
-
s.add_dependency(%q<rspec-rails>, [">= 2.
|
112
|
-
s.add_dependency(%q<rspec>, [">= 2.
|
113
|
-
s.add_dependency(%q<actionpack>, [">=
|
119
|
+
s.add_dependency(%q<rspec-rails>, [">= 2.8.0"])
|
120
|
+
s.add_dependency(%q<rspec>, [">= 2.8.0"])
|
121
|
+
s.add_dependency(%q<actionpack>, [">= 4.0.0"])
|
114
122
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
123
|
+
s.add_dependency(%q<nokogiri>, [">= 0"])
|
115
124
|
s.add_dependency(%q<generator_spec>, [">= 0"])
|
116
125
|
s.add_dependency(%q<rspec>, [">= 2.0.0"])
|
117
126
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
3
|
+
|
4
|
+
group :development, :test do
|
5
|
+
gem "rails", "~> 3.2.0"
|
6
|
+
gem "sqlite3"
|
7
|
+
gem "json_pure"
|
8
|
+
gem "jeweler"
|
9
|
+
gem "rspec-rails", ">= 2.8.0"
|
10
|
+
gem "rspec", ">= 2.8.0"
|
11
|
+
gem "actionpack", "~> 3.2.0"
|
12
|
+
gem "simplecov", :require => false
|
13
|
+
|
14
|
+
gem 'nokogiri'
|
15
|
+
|
16
|
+
gem "generator_spec"
|
17
|
+
end
|
18
|
+
|
19
|
+
# To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
|
20
|
+
# gem 'ruby-debug'
|
21
|
+
# gem 'ruby-debug19'
|
@@ -0,0 +1,154 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
actionmailer (3.2.13)
|
5
|
+
actionpack (= 3.2.13)
|
6
|
+
mail (~> 2.5.3)
|
7
|
+
actionpack (3.2.13)
|
8
|
+
activemodel (= 3.2.13)
|
9
|
+
activesupport (= 3.2.13)
|
10
|
+
builder (~> 3.0.0)
|
11
|
+
erubis (~> 2.7.0)
|
12
|
+
journey (~> 1.0.4)
|
13
|
+
rack (~> 1.4.5)
|
14
|
+
rack-cache (~> 1.2)
|
15
|
+
rack-test (~> 0.6.1)
|
16
|
+
sprockets (~> 2.2.1)
|
17
|
+
activemodel (3.2.13)
|
18
|
+
activesupport (= 3.2.13)
|
19
|
+
builder (~> 3.0.0)
|
20
|
+
activerecord (3.2.13)
|
21
|
+
activemodel (= 3.2.13)
|
22
|
+
activesupport (= 3.2.13)
|
23
|
+
arel (~> 3.0.2)
|
24
|
+
tzinfo (~> 0.3.29)
|
25
|
+
activeresource (3.2.13)
|
26
|
+
activemodel (= 3.2.13)
|
27
|
+
activesupport (= 3.2.13)
|
28
|
+
activesupport (3.2.13)
|
29
|
+
i18n (= 0.6.1)
|
30
|
+
multi_json (~> 1.0)
|
31
|
+
addressable (2.3.5)
|
32
|
+
arel (3.0.2)
|
33
|
+
builder (3.0.4)
|
34
|
+
diff-lcs (1.2.4)
|
35
|
+
erubis (2.7.0)
|
36
|
+
faraday (0.8.7)
|
37
|
+
multipart-post (~> 1.1)
|
38
|
+
generator_spec (0.9.0)
|
39
|
+
activerecord (>= 3.0, <= 4.0)
|
40
|
+
railties (>= 3.0, <= 4.0)
|
41
|
+
git (1.2.5)
|
42
|
+
github_api (0.10.1)
|
43
|
+
addressable
|
44
|
+
faraday (~> 0.8.1)
|
45
|
+
hashie (>= 1.2)
|
46
|
+
multi_json (~> 1.4)
|
47
|
+
nokogiri (~> 1.5.2)
|
48
|
+
oauth2
|
49
|
+
hashie (2.0.5)
|
50
|
+
highline (1.6.19)
|
51
|
+
hike (1.2.3)
|
52
|
+
httpauth (0.2.0)
|
53
|
+
i18n (0.6.1)
|
54
|
+
jeweler (1.8.6)
|
55
|
+
builder
|
56
|
+
bundler (~> 1.0)
|
57
|
+
git (>= 1.2.5)
|
58
|
+
github_api (= 0.10.1)
|
59
|
+
highline (>= 1.6.15)
|
60
|
+
nokogiri (= 1.5.10)
|
61
|
+
rake
|
62
|
+
rdoc
|
63
|
+
journey (1.0.4)
|
64
|
+
json (1.8.0)
|
65
|
+
json_pure (1.8.0)
|
66
|
+
jwt (0.1.8)
|
67
|
+
multi_json (>= 1.5)
|
68
|
+
mail (2.5.4)
|
69
|
+
mime-types (~> 1.16)
|
70
|
+
treetop (~> 1.4.8)
|
71
|
+
mime-types (1.23)
|
72
|
+
multi_json (1.7.7)
|
73
|
+
multi_xml (0.5.4)
|
74
|
+
multipart-post (1.2.0)
|
75
|
+
nokogiri (1.5.10)
|
76
|
+
oauth2 (0.9.2)
|
77
|
+
faraday (~> 0.8)
|
78
|
+
httpauth (~> 0.2)
|
79
|
+
jwt (~> 0.1.4)
|
80
|
+
multi_json (~> 1.0)
|
81
|
+
multi_xml (~> 0.5)
|
82
|
+
rack (~> 1.2)
|
83
|
+
polyglot (0.3.3)
|
84
|
+
rack (1.4.5)
|
85
|
+
rack-cache (1.2)
|
86
|
+
rack (>= 0.4)
|
87
|
+
rack-ssl (1.3.3)
|
88
|
+
rack
|
89
|
+
rack-test (0.6.2)
|
90
|
+
rack (>= 1.0)
|
91
|
+
rails (3.2.13)
|
92
|
+
actionmailer (= 3.2.13)
|
93
|
+
actionpack (= 3.2.13)
|
94
|
+
activerecord (= 3.2.13)
|
95
|
+
activeresource (= 3.2.13)
|
96
|
+
activesupport (= 3.2.13)
|
97
|
+
bundler (~> 1.0)
|
98
|
+
railties (= 3.2.13)
|
99
|
+
railties (3.2.13)
|
100
|
+
actionpack (= 3.2.13)
|
101
|
+
activesupport (= 3.2.13)
|
102
|
+
rack-ssl (~> 1.3.2)
|
103
|
+
rake (>= 0.8.7)
|
104
|
+
rdoc (~> 3.4)
|
105
|
+
thor (>= 0.14.6, < 2.0)
|
106
|
+
rake (10.1.0)
|
107
|
+
rdoc (3.12.2)
|
108
|
+
json (~> 1.4)
|
109
|
+
rspec (2.14.0)
|
110
|
+
rspec-core (~> 2.14.0)
|
111
|
+
rspec-expectations (~> 2.14.0)
|
112
|
+
rspec-mocks (~> 2.14.0)
|
113
|
+
rspec-core (2.14.2)
|
114
|
+
rspec-expectations (2.14.0)
|
115
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
116
|
+
rspec-mocks (2.14.1)
|
117
|
+
rspec-rails (2.14.0)
|
118
|
+
actionpack (>= 3.0)
|
119
|
+
activesupport (>= 3.0)
|
120
|
+
railties (>= 3.0)
|
121
|
+
rspec-core (~> 2.14.0)
|
122
|
+
rspec-expectations (~> 2.14.0)
|
123
|
+
rspec-mocks (~> 2.14.0)
|
124
|
+
simplecov (0.7.1)
|
125
|
+
multi_json (~> 1.0)
|
126
|
+
simplecov-html (~> 0.7.1)
|
127
|
+
simplecov-html (0.7.1)
|
128
|
+
sprockets (2.2.2)
|
129
|
+
hike (~> 1.2)
|
130
|
+
multi_json (~> 1.0)
|
131
|
+
rack (~> 1.0)
|
132
|
+
tilt (~> 1.1, != 1.3.0)
|
133
|
+
sqlite3 (1.3.7)
|
134
|
+
thor (0.18.1)
|
135
|
+
tilt (1.4.1)
|
136
|
+
treetop (1.4.14)
|
137
|
+
polyglot
|
138
|
+
polyglot (>= 0.3.1)
|
139
|
+
tzinfo (0.3.37)
|
140
|
+
|
141
|
+
PLATFORMS
|
142
|
+
ruby
|
143
|
+
|
144
|
+
DEPENDENCIES
|
145
|
+
actionpack (~> 3.2.0)
|
146
|
+
generator_spec
|
147
|
+
jeweler
|
148
|
+
json_pure
|
149
|
+
nokogiri
|
150
|
+
rails (~> 3.2.0)
|
151
|
+
rspec (>= 2.8.0)
|
152
|
+
rspec-rails (>= 2.8.0)
|
153
|
+
simplecov
|
154
|
+
sqlite3
|
data/lib/cocoon.rb
CHANGED
@@ -4,7 +4,9 @@ module Cocoon
|
|
4
4
|
class Engine < ::Rails::Engine
|
5
5
|
|
6
6
|
config.before_initialize do
|
7
|
-
config.action_view.javascript_expansions
|
7
|
+
if config.action_view.javascript_expansions
|
8
|
+
config.action_view.javascript_expansions[:cocoon] = %w(cocoon)
|
9
|
+
end
|
8
10
|
end
|
9
11
|
|
10
12
|
# configure our plugin on boot
|
data/lib/cocoon/view_helpers.rb
CHANGED
@@ -121,6 +121,10 @@ module Cocoon
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def create_object_with_conditions(instance)
|
124
|
+
# in rails 4, an association is defined with a proc
|
125
|
+
# and I did not find how to extract the conditions from a scope
|
126
|
+
# except building from the scope, but then why not just build from the
|
127
|
+
# association???
|
124
128
|
conditions = instance.respond_to?(:conditions) ? instance.conditions.flatten : []
|
125
129
|
instance.klass.new(*conditions)
|
126
130
|
end
|
data/spec/cocoon_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'nokogiri'
|
2
3
|
|
3
4
|
describe Cocoon do
|
4
5
|
class TestClass < ActionView::Base
|
@@ -13,7 +14,7 @@ describe Cocoon do
|
|
13
14
|
before(:each) do
|
14
15
|
@tester = TestClass.new
|
15
16
|
@post = Post.new
|
16
|
-
@form_obj =
|
17
|
+
@form_obj = double(:object => @post, :object_name => @post.class.name)
|
17
18
|
end
|
18
19
|
|
19
20
|
|
@@ -23,21 +24,31 @@ describe Cocoon do
|
|
23
24
|
end
|
24
25
|
|
25
26
|
context "without a block" do
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
|
28
|
+
context "and given a name" do
|
29
|
+
before do
|
30
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :comments)
|
31
|
+
end
|
32
|
+
|
33
|
+
it_behaves_like "a correctly rendered add link", {}
|
29
34
|
end
|
30
35
|
|
31
|
-
|
32
|
-
|
33
|
-
|
36
|
+
context "and given html options to pass them to link_to" do
|
37
|
+
before do
|
38
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :comments, {:class => 'something silly'})
|
39
|
+
end
|
40
|
+
|
41
|
+
it_behaves_like "a correctly rendered add link", {class: 'something silly add_fields' }
|
34
42
|
end
|
35
43
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
44
|
+
context "and explicitly specifying the wanted partial" do
|
45
|
+
before do
|
46
|
+
@tester.unstub(:render_association)
|
47
|
+
@tester.should_receive(:render_association).with(anything(), anything(), anything(), anything(), "shared/partial").and_return('partiallll')
|
48
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :comments, :partial => "shared/partial")
|
49
|
+
end
|
50
|
+
|
51
|
+
it_behaves_like "a correctly rendered add link", {template: "partiallll"}
|
41
52
|
end
|
42
53
|
|
43
54
|
it "gives an opportunity to wrap/decorate created objects" do
|
@@ -47,61 +58,101 @@ describe Cocoon do
|
|
47
58
|
end
|
48
59
|
|
49
60
|
context "force non association create" do
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
result = @tester.link_to_add_association('add something', @form_obj, :comments, :force_non_association_create => false)
|
58
|
-
result.to_s.should == '<a href="#" class="add_fields" data-association-insertion-template="form<tag>" data-association="comment" data-associations="comments">add something</a>'
|
61
|
+
context "default case: create object on association" do
|
62
|
+
before do
|
63
|
+
@tester.should_receive(:create_object).with(anything, :comments , false)
|
64
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :comments)
|
65
|
+
end
|
66
|
+
|
67
|
+
it_behaves_like "a correctly rendered add link", {}
|
59
68
|
end
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
69
|
+
|
70
|
+
context "and explicitly specifying false is the same as default" do
|
71
|
+
before do
|
72
|
+
@tester.should_receive(:create_object).with(anything, :comments , false)
|
73
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :comments, :force_non_association_create => false)
|
74
|
+
end
|
75
|
+
it_behaves_like "a correctly rendered add link", {}
|
64
76
|
end
|
65
77
|
|
78
|
+
context "specifying true will not create objects on association but using the conditions" do
|
79
|
+
before do
|
80
|
+
@tester.should_receive(:create_object).with(anything, :comments , true)
|
81
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :comments, :force_non_association_create => true)
|
82
|
+
end
|
83
|
+
it_behaves_like "a correctly rendered add link", {}
|
84
|
+
end
|
66
85
|
end
|
67
86
|
end
|
68
87
|
|
69
88
|
context "with a block" do
|
70
|
-
|
71
|
-
|
72
|
-
|
89
|
+
context "and the block specifies the link text" do
|
90
|
+
before do
|
91
|
+
@html = @tester.link_to_add_association(@form_obj, :comments) do
|
92
|
+
"some long name"
|
93
|
+
end
|
73
94
|
end
|
74
|
-
|
95
|
+
it_behaves_like "a correctly rendered add link", {text: 'some long name'}
|
75
96
|
end
|
76
97
|
|
77
|
-
|
78
|
-
|
79
|
-
|
98
|
+
context "accepts html options and pass them to link_to" do
|
99
|
+
before do
|
100
|
+
@html = @tester.link_to_add_association(@form_obj, :comments, {:class => 'floppy disk'}) do
|
101
|
+
"some long name"
|
102
|
+
end
|
80
103
|
end
|
81
|
-
|
104
|
+
it_behaves_like "a correctly rendered add link", {class: 'floppy disk add_fields', text: 'some long name'}
|
82
105
|
end
|
83
106
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
107
|
+
context "accepts extra attributes and pass them to link_to" do
|
108
|
+
context 'when using the old notation' do
|
109
|
+
before do
|
110
|
+
@html = @tester.link_to_add_association(@form_obj, :comments, {:class => 'floppy disk', 'data-something' => 'bla'}) do
|
111
|
+
"some long name"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
it_behaves_like "a correctly rendered add link", {class: 'floppy disk add_fields', text: 'some long name', :extra_attributes => {'data-something' => 'bla'}}
|
115
|
+
end
|
116
|
+
if Rails.rails4?
|
117
|
+
context 'when using the new notation' do
|
118
|
+
before do
|
119
|
+
@html = @tester.link_to_add_association(@form_obj, :comments, {:class => 'floppy disk', :data => {:'association-something' => 'foobar'}}) do
|
120
|
+
"some long name"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
it_behaves_like "a correctly rendered add link", {class: 'floppy disk add_fields', text: 'some long name', :extra_attributes => {'data-association-something' => 'foobar'}}
|
124
|
+
end
|
89
125
|
end
|
90
|
-
|
126
|
+
end
|
127
|
+
|
128
|
+
context "and explicitly specifying the wanted partial" do
|
129
|
+
before do
|
130
|
+
@tester.unstub(:render_association)
|
131
|
+
@tester.should_receive(:render_association).with(anything(), anything(), anything(), anything(), "shared/partial").and_return('partiallll')
|
132
|
+
@html = @tester.link_to_add_association( @form_obj, :comments, :class => 'floppy disk', :partial => "shared/partial") do
|
133
|
+
"some long name"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
it_behaves_like "a correctly rendered add link", {class: 'floppy disk add_fields', template: "partiallll", text: 'some long name'}
|
91
138
|
end
|
92
139
|
end
|
93
140
|
|
94
141
|
context "with an irregular plural" do
|
95
|
-
|
96
|
-
|
97
|
-
|
142
|
+
context "uses the correct plural" do
|
143
|
+
before do
|
144
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :people)
|
145
|
+
end
|
146
|
+
it_behaves_like "a correctly rendered add link", {association: 'person', associations: 'people' }
|
98
147
|
end
|
99
148
|
end
|
100
149
|
|
101
150
|
context "when using aliased association and class-name" do
|
102
|
-
|
103
|
-
|
104
|
-
|
151
|
+
context "uses the correct name" do
|
152
|
+
before do
|
153
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :admin_comments)
|
154
|
+
end
|
155
|
+
it_behaves_like "a correctly rendered add link", {association: 'admin_comment', associations: 'admin_comments'}
|
105
156
|
end
|
106
157
|
end
|
107
158
|
|
@@ -110,27 +161,35 @@ describe Cocoon do
|
|
110
161
|
end
|
111
162
|
|
112
163
|
context "with extra render-options for rendering the child relation" do
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
164
|
+
context "uses the correct plural" do
|
165
|
+
before do
|
166
|
+
@tester.should_receive(:render_association).with(:people, @form_obj, anything, {:wrapper => 'inline'}, nil)
|
167
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :people, :render_options => {:wrapper => 'inline'})
|
168
|
+
end
|
169
|
+
it_behaves_like "a correctly rendered add link", {association: 'person', associations: 'people' }
|
117
170
|
end
|
118
171
|
end
|
119
172
|
|
120
173
|
context "passing locals to the partial" do
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
174
|
+
context "when given: passes the locals to the partials" do
|
175
|
+
before do
|
176
|
+
@tester.unstub(:render_association)
|
177
|
+
@form_obj.should_receive(:fields_for) { | association, new_object, options_hash, &block| block.call }
|
178
|
+
@tester.should_receive(:render).with("person_fields", {:f=>nil, :dynamic=>true, :alfred=>"Judoka"}).and_return ("partiallll")
|
179
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :people, :render_options => {:wrapper => 'inline', :locals => {:alfred => 'Judoka'}})
|
180
|
+
end
|
181
|
+
it_behaves_like "a correctly rendered add link", {template: 'partiallll', association: 'person', associations: 'people' }
|
127
182
|
end
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
183
|
+
context "if no locals are given it still works" do
|
184
|
+
before do
|
185
|
+
@tester.unstub(:render_association)
|
186
|
+
@form_obj.should_receive(:fields_for) { | association, new_object, options_hash, &block| block.call }
|
187
|
+
@tester.should_receive(:render).with("person_fields", {:f=>nil, :dynamic=>true}).and_return ("partiallll")
|
188
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :people, :render_options => {:wrapper => 'inline'})
|
189
|
+
end
|
190
|
+
it_behaves_like "a correctly rendered add link", {template: 'partiallll', association: 'person', associations: 'people' }
|
191
|
+
|
192
|
+
#result.to_s.should == '<a href="#" class="add_fields" data-association-insertion-template="partiallll" data-association="person" data-associations="people">add something</a>'
|
134
193
|
end
|
135
194
|
end
|
136
195
|
|
@@ -141,12 +200,13 @@ describe Cocoon do
|
|
141
200
|
@tester.unstub(:render_association)
|
142
201
|
@form_obj.stub(:semantic_fields_for).and_return('form<tagzzz>')
|
143
202
|
end
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
203
|
+
context "calls semantic_fields_for and not fields_for" do
|
204
|
+
before do
|
205
|
+
@form_obj.should_receive(:semantic_fields_for)
|
206
|
+
@form_obj.should_receive(:fields_for).never
|
207
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :people)
|
208
|
+
end
|
209
|
+
it_behaves_like "a correctly rendered add link", {template: 'form<tagzzz>', association: 'person', associations: 'people' }
|
150
210
|
end
|
151
211
|
end
|
152
212
|
context "when using simple_form" do
|
@@ -157,12 +217,13 @@ describe Cocoon do
|
|
157
217
|
it "responds_to :simple_fields_for" do
|
158
218
|
@form_obj.should respond_to(:simple_fields_for)
|
159
219
|
end
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
220
|
+
context "calls simple_fields_for and not fields_for" do
|
221
|
+
before do
|
222
|
+
@form_obj.should_receive(:simple_fields_for)
|
223
|
+
@form_obj.should_receive(:fields_for).never
|
224
|
+
@html = @tester.link_to_add_association('add something', @form_obj, :people)
|
225
|
+
end
|
226
|
+
it_behaves_like "a correctly rendered add link", {template: 'form<tagxxx>', association: 'person', associations: 'people' }
|
166
227
|
end
|
167
228
|
end
|
168
229
|
|
@@ -170,31 +231,47 @@ describe Cocoon do
|
|
170
231
|
|
171
232
|
context "link_to_remove_association" do
|
172
233
|
context "without a block" do
|
173
|
-
|
174
|
-
|
175
|
-
|
234
|
+
context "accepts a name" do
|
235
|
+
before do
|
236
|
+
@html = @tester.link_to_remove_association('remove something', @form_obj)
|
237
|
+
end
|
238
|
+
|
239
|
+
it "is rendered inside a input element" do
|
240
|
+
doc = Nokogiri::HTML(@html)
|
241
|
+
removed = doc.at('input')
|
242
|
+
removed.attribute('id').value.should == "Post__destroy"
|
243
|
+
removed.attribute('name').value.should == "Post[_destroy]"
|
244
|
+
end
|
245
|
+
|
246
|
+
it_behaves_like "a correctly rendered remove link", {}
|
176
247
|
end
|
177
248
|
|
178
|
-
|
179
|
-
|
180
|
-
|
249
|
+
context "accepts html options and pass them to link_to" do
|
250
|
+
before do
|
251
|
+
@html = @tester.link_to_remove_association('remove something', @form_obj, {:class => 'add_some_class', :'data-something' => 'bla'})
|
252
|
+
end
|
253
|
+
it_behaves_like "a correctly rendered remove link", {class: 'add_some_class remove_fields dynamic', extra_attributes: {'data-something' => 'bla'}}
|
181
254
|
end
|
182
255
|
|
183
256
|
end
|
184
257
|
|
185
258
|
context "with a block" do
|
186
|
-
|
187
|
-
|
188
|
-
|
259
|
+
context "the block gives the name" do
|
260
|
+
before do
|
261
|
+
@html = @tester.link_to_remove_association(@form_obj) do
|
262
|
+
"remove some long name"
|
263
|
+
end
|
189
264
|
end
|
190
|
-
|
265
|
+
it_behaves_like "a correctly rendered remove link", {text: 'remove some long name'}
|
191
266
|
end
|
192
267
|
|
193
|
-
|
194
|
-
|
195
|
-
|
268
|
+
context "accepts html options and pass them to link_to" do
|
269
|
+
before do
|
270
|
+
@html = @tester.link_to_remove_association(@form_obj, {:class => 'add_some_class', :'data-something' => 'bla'}) do
|
271
|
+
"remove some long name"
|
272
|
+
end
|
196
273
|
end
|
197
|
-
|
274
|
+
it_behaves_like "a correctly rendered remove link", {text: 'remove some long name', class: 'add_some_class remove_fields dynamic', extra_attributes: {'data-something' => 'bla'}}
|
198
275
|
end
|
199
276
|
end
|
200
277
|
end
|
@@ -202,29 +279,35 @@ describe Cocoon do
|
|
202
279
|
context "create_object" do
|
203
280
|
it "creates correct association with conditions" do
|
204
281
|
@tester.should_not_receive(:create_object_with_conditions)
|
282
|
+
# in rails4 we cannot create an associated object when the object has not been saved before
|
283
|
+
# I submitted a bug for this: https://github.com/rails/rails/issues/11376
|
284
|
+
if Rails.rails4?
|
285
|
+
@post = Post.create(title: 'Testing')
|
286
|
+
@form_obj = double(:object => @post, :object_name => @post.class.name)
|
287
|
+
end
|
205
288
|
result = @tester.create_object(@form_obj, :admin_comments)
|
206
289
|
result.author.should == "Admin"
|
207
290
|
end
|
208
291
|
|
209
292
|
it "creates correct association for belongs_to associations" do
|
210
|
-
result = @tester.create_object(
|
293
|
+
result = @tester.create_object(double(:object => Comment.new), :post)
|
211
294
|
result.should be_a Post
|
212
295
|
end
|
213
296
|
|
214
297
|
it "raises an error if cannot reflect on association" do
|
215
|
-
expect { @tester.create_object(
|
298
|
+
expect { @tester.create_object(double(:object => Comment.new), :not_existing) }.to raise_error /association/i
|
216
299
|
end
|
217
300
|
|
218
301
|
it "creates an association if object responds to 'build_association' as singular" do
|
219
302
|
object = Comment.new
|
220
303
|
object.should_receive(:build_custom_item).and_return 'custom'
|
221
|
-
@tester.create_object(
|
304
|
+
@tester.create_object(double(:object => object), :custom_item).should == 'custom'
|
222
305
|
end
|
223
306
|
|
224
307
|
it "creates an association if object responds to 'build_association' as plural" do
|
225
308
|
object = Comment.new
|
226
309
|
object.should_receive(:build_custom_item).and_return 'custom'
|
227
|
-
@tester.create_object(
|
310
|
+
@tester.create_object(double(:object => object), :custom_items).should == 'custom'
|
228
311
|
end
|
229
312
|
|
230
313
|
it "can create using only conditions not the association" do
|