cocoon 1.1.2 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|