dry_forms 0.2.1 → 0.2.2
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/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/dry_forms/builder_additions.rb +16 -17
- data/test/helper.rb +9 -13
- data/test/support/models.rb +1 -2
- data/test/test_dry_forms.rb +55 -12
- metadata +7 -7
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ begin
|
|
10
10
|
gem.email = "macarui@gmail.com"
|
11
11
|
gem.homepage = "http://github.com/maca/dry_forms"
|
12
12
|
gem.authors = ["Macario Ortega"]
|
13
|
-
gem.add_development_dependency "
|
13
|
+
gem.add_development_dependency "shoulda", ">= 0"
|
14
14
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
15
|
end
|
16
16
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.2
|
@@ -22,14 +22,15 @@ module DryForms
|
|
22
22
|
@object.errors[attribute]
|
23
23
|
end
|
24
24
|
|
25
|
-
DryForms.field_markup
|
25
|
+
ActiveSupport::SafeBuffer.new DryForms.field_markup(label, field, [*errors].compact, html_opts)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
def fields_for_association association, *args, &block
|
30
30
|
options = args.extract_options!
|
31
31
|
association = association.to_s
|
32
|
-
objects =
|
32
|
+
objects = args.first ? [*args.first] : @object.send(association)
|
33
|
+
html = options.delete(:html)
|
33
34
|
|
34
35
|
unless @object.respond_to? "#{association.pluralize}_attributes="
|
35
36
|
raise NotImplementedError, "Please call `accepts_nested_attributes_for :#{association.pluralize}` in your `#{@object.class}` Model"
|
@@ -39,44 +40,42 @@ module DryForms
|
|
39
40
|
|
40
41
|
association_class = @object.class.reflect_on_association(association.to_sym).klass
|
41
42
|
singular_name = association.singularize
|
42
|
-
fields = objects.map{ |obj| association_fields(association, obj, &block) }.join
|
43
|
+
fields = objects.map{ |obj| association_fields(association, obj, :html => html, &block) }.join
|
43
44
|
new_object = @object.send(association).build options.delete(:default_attributes) || {}
|
44
|
-
js_fields = association_fields association, new_object, :child_index => "new_#{singular_name}", &block
|
45
|
+
js_fields = association_fields association, new_object, :child_index => "new_#{singular_name}", :html => html, &block
|
45
46
|
|
46
|
-
|
47
|
+
association_fields = <<-HTML
|
47
48
|
<div id="#{association}">
|
48
49
|
#{fields}
|
49
50
|
#{@template.javascript_tag "var fields_for_#{singular_name} = '#{js_fields.strip.gsub /\n\s+|\n/, ''}';"}
|
50
51
|
<a href="#" class="add_fields" data-association="#{singular_name}">#{I18n.t 'add', :model => association_class.human_name}</a>
|
51
52
|
</div>
|
52
53
|
HTML
|
54
|
+
|
55
|
+
@template.concat ActiveSupport::SafeBuffer.new association_fields
|
53
56
|
end
|
54
57
|
|
55
58
|
def custom_fields_for *args, &block
|
56
59
|
opts = args.extract_options!
|
57
60
|
html_opts = opts.delete(:html) || {}
|
58
61
|
fields = @template.capture{fields_for *(args << opts), &block}
|
59
|
-
@template.concat DryForms.fields_for_markup(fields, html_opts) unless fields.empty?
|
62
|
+
@template.concat ActiveSupport::SafeBuffer.new DryForms.fields_for_markup(fields, html_opts) unless fields.empty?
|
60
63
|
end
|
61
64
|
|
62
65
|
private
|
63
66
|
def association_fields association, object, opts = {}, &block
|
64
|
-
opts.
|
67
|
+
html = opts.delete(:html) || {}
|
68
|
+
opts.merge! :html => html.merge(:class => "associated", :'data-association' => association.singularize)
|
65
69
|
|
66
|
-
|
70
|
+
association_fields = @template.capture do
|
67
71
|
custom_fields_for association.to_sym, object, opts do |fields|
|
68
72
|
@template.concat fields.hidden_field :_destroy, :class => 'destroy'
|
69
73
|
yield fields
|
70
|
-
@template.concat %{<a class="remove" href="#">#{I18n.t "remove"}</a>}
|
74
|
+
@template.concat ActiveSupport::SafeBuffer.new %{<a class="remove" href="#">#{I18n.t "remove"}</a>}
|
71
75
|
end
|
72
76
|
end
|
73
|
-
end
|
74
77
|
|
75
|
-
|
76
|
-
|
77
|
-
# options[:class] = "submit #{ options[:class] }".strip
|
78
|
-
# value = args.first || I18n.t(@object.new_record? ? 'create' : 'save', :scope => 'helpers.submit')
|
79
|
-
# super value, options
|
80
|
-
# end
|
78
|
+
ActiveSupport::SafeBuffer.new %{#{association_fields}}
|
79
|
+
end
|
81
80
|
end
|
82
|
-
end
|
81
|
+
end
|
data/test/helper.rb
CHANGED
@@ -3,12 +3,10 @@ require 'test/unit'
|
|
3
3
|
require 'shoulda'
|
4
4
|
|
5
5
|
require 'active_support'
|
6
|
-
require 'action_pack'
|
7
6
|
require 'active_record'
|
8
7
|
require 'action_controller'
|
9
8
|
require 'action_view'
|
10
9
|
require 'action_view/test_case'
|
11
|
-
require 'action_controller/test_process'
|
12
10
|
|
13
11
|
$LOAD_PATH.unshift "#{File.dirname __FILE__}/../lib"
|
14
12
|
$LOAD_PATH.unshift File.dirname(__FILE__)
|
@@ -16,18 +14,16 @@ $LOAD_PATH.unshift File.dirname(__FILE__)
|
|
16
14
|
require 'dry_forms'
|
17
15
|
require 'support/models'
|
18
16
|
|
19
|
-
ActionController::Base.view_paths << FIXTURES = "#{ File.dirname __FILE__ }/fixtures'"
|
20
|
-
|
21
|
-
class ActionView::TestCase::TestController
|
22
|
-
attr_reader :url_for_options
|
23
|
-
def url_for(options)
|
24
|
-
@url_for_options = options
|
25
|
-
"/do"
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
17
|
class ActionView::Base
|
31
18
|
def protect_against_forgery?; end
|
32
19
|
end
|
33
20
|
|
21
|
+
require 'ostruct'
|
22
|
+
|
23
|
+
module ActionController::UrlFor
|
24
|
+
def _routes
|
25
|
+
helpers = OpenStruct.new
|
26
|
+
helpers.url_helpers = Module.new
|
27
|
+
helpers
|
28
|
+
end
|
29
|
+
end
|
data/test/support/models.rb
CHANGED
@@ -22,7 +22,6 @@ ActiveRecord::Schema.define :version => 1 do
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
|
26
25
|
class Post < ActiveRecord::Base
|
27
26
|
belongs_to :author
|
28
27
|
accepts_nested_attributes_for :author
|
@@ -37,4 +36,4 @@ class Author < ActiveRecord::Base
|
|
37
36
|
has_many :posts
|
38
37
|
has_many :comments
|
39
38
|
accepts_nested_attributes_for :posts
|
40
|
-
end
|
39
|
+
end
|
data/test/test_dry_forms.rb
CHANGED
@@ -12,7 +12,7 @@ class FormHelperTest < ActionView::TestCase
|
|
12
12
|
context 'helper method rendering' do
|
13
13
|
should 'render check_box with custom markup and display human_attribute_name' do
|
14
14
|
erb = <<-ERB
|
15
|
-
<% custom_form_for :post, @post do |f| %>
|
15
|
+
<% custom_form_for :post, @post, :url => '/do' do |f| %>
|
16
16
|
<%= f.custom_text_field :title, :class => 'title' %>
|
17
17
|
<% end %>
|
18
18
|
ERB
|
@@ -31,7 +31,7 @@ class FormHelperTest < ActionView::TestCase
|
|
31
31
|
|
32
32
|
should 'render check_box with custom markup and display human_attribute_name and html attributes' do
|
33
33
|
erb = <<-ERB
|
34
|
-
<% custom_form_for :post, @post do |f| %>
|
34
|
+
<% custom_form_for :post, @post, :url => '/do' do |f| %>
|
35
35
|
<%= f.custom_text_field :title, :class => 'title', :html => {:id => 'id', :class => 'class'} %>
|
36
36
|
<% end %>
|
37
37
|
ERB
|
@@ -55,7 +55,7 @@ class FormHelperTest < ActionView::TestCase
|
|
55
55
|
assert_equal false, @post.valid?
|
56
56
|
|
57
57
|
erb = <<-ERB
|
58
|
-
<% custom_form_for :post, @post do |f| %>
|
58
|
+
<% custom_form_for :post, @post, :url => '/do' do |f| %>
|
59
59
|
<%= f.custom_text_field :title, :class => 'title' %>
|
60
60
|
<% end %>
|
61
61
|
ERB
|
@@ -82,7 +82,7 @@ class FormHelperTest < ActionView::TestCase
|
|
82
82
|
|
83
83
|
should 'render js fields' do
|
84
84
|
erb = <<-ERB
|
85
|
-
<% form_for :author, @author do |form| %>
|
85
|
+
<% form_for :author, @author, :url => '/do' do |form| %>
|
86
86
|
<h2>Posts</h2>
|
87
87
|
<% form.fields_for_association :posts do |post| %>
|
88
88
|
<%= post.text_field :title %>
|
@@ -91,7 +91,7 @@ class FormHelperTest < ActionView::TestCase
|
|
91
91
|
ERB
|
92
92
|
|
93
93
|
js_fields = <<-HTML
|
94
|
-
<fieldset
|
94
|
+
<fieldset data-association="post" class="associated">
|
95
95
|
<input class="destroy" id="author_posts_attributes_new_post__destroy" name="author[posts_attributes][new_post][_destroy]" type="hidden" />
|
96
96
|
<input id="author_posts_attributes_new_post_title" name="author[posts_attributes][new_post][title]" size="30" type="text" />
|
97
97
|
<a class="remove" href="#">translation missing: en, remove</a>
|
@@ -120,7 +120,7 @@ class FormHelperTest < ActionView::TestCase
|
|
120
120
|
@author.posts.create! :title => "Hello World 2", :body => "Looking good"
|
121
121
|
|
122
122
|
erb = <<-ERB
|
123
|
-
<% form_for :author, @author do |form| %>
|
123
|
+
<% form_for :author, @author, :url => '/do' do |form| %>
|
124
124
|
<h2>Posts</h2>
|
125
125
|
<% form.fields_for_association :posts do |post| %>
|
126
126
|
<%= post.text_field :title %>
|
@@ -129,7 +129,7 @@ class FormHelperTest < ActionView::TestCase
|
|
129
129
|
ERB
|
130
130
|
|
131
131
|
js_fields = <<-HTML
|
132
|
-
<fieldset
|
132
|
+
<fieldset data-association="post" class="associated">
|
133
133
|
<input class="destroy" id="author_posts_attributes_new_post__destroy" name="author[posts_attributes][new_post][_destroy]" type="hidden" />
|
134
134
|
<input id="author_posts_attributes_new_post_title" name="author[posts_attributes][new_post][title]" size="30" type="text" />
|
135
135
|
<a class="remove" href="#">translation missing: en, remove</a>
|
@@ -165,12 +165,55 @@ class FormHelperTest < ActionView::TestCase
|
|
165
165
|
assert_dom_equal html, render(:inline => erb)
|
166
166
|
end
|
167
167
|
|
168
|
+
should 'render field for existing associations allowing custom html' do
|
169
|
+
@author.posts.create! :title => "Hello World", :body => "Looking good"
|
170
|
+
|
171
|
+
erb = <<-ERB
|
172
|
+
<% form_for :author, @author, :url => '/do' do |form| %>
|
173
|
+
<h2>Posts</h2>
|
174
|
+
<% form.fields_for_association :posts, :html => {'data-custom' => 'data'} do |post| %>
|
175
|
+
<%= post.text_field :title %>
|
176
|
+
<% end %>
|
177
|
+
<% end %>
|
178
|
+
ERB
|
179
|
+
|
180
|
+
js_fields = <<-HTML
|
181
|
+
<fieldset data-association="post" class="associated" data-custom="data">
|
182
|
+
<input class="destroy" id="author_posts_attributes_new_post__destroy" name="author[posts_attributes][new_post][_destroy]" type="hidden" />
|
183
|
+
<input id="author_posts_attributes_new_post_title" name="author[posts_attributes][new_post][title]" size="30" type="text" />
|
184
|
+
<a class="remove" href="#">translation missing: en, remove</a>
|
185
|
+
</fieldset>
|
186
|
+
HTML
|
187
|
+
|
188
|
+
html = <<-HTML
|
189
|
+
<form method="post" action="/do">
|
190
|
+
<h2>Posts</h2>
|
191
|
+
<div id="posts">
|
192
|
+
<fieldset class="associated" data-association="post" data-custom="data">
|
193
|
+
<input class="destroy" name="author[posts_attributes][0][_destroy]" id="author_posts_attributes_0__destroy" type="hidden" />
|
194
|
+
<input name="author[posts_attributes][0][title]" size="30" id="author_posts_attributes_0_title" type="text" value="Hello World" />
|
195
|
+
<a href="#" class="remove">translation missing: en, remove</a>
|
196
|
+
<input name="author[posts_attributes][0][id]" id="author_posts_attributes_0_id" type="hidden" value="#{ @author.posts.first.id }" />
|
197
|
+
</fieldset>
|
198
|
+
<script type="text/javascript">
|
199
|
+
//<![CDATA[
|
200
|
+
var fields_for_post = '#{js_fields.gsub(/\n\s+/, '').strip}';
|
201
|
+
//]]>
|
202
|
+
</script>
|
203
|
+
<a href="#" class="add_fields" data-association="post">translation missing: en, add</a>
|
204
|
+
</div>
|
205
|
+
</form>
|
206
|
+
HTML
|
207
|
+
|
208
|
+
assert_dom_equal html, render(:inline => erb)
|
209
|
+
end
|
210
|
+
|
168
211
|
should 'render field for existing associations passing objects' do
|
169
212
|
@author.posts.create! :title => "Hello World", :body => "Looking good"
|
170
213
|
@author.posts.create! :title => "Hello World 2", :body => "Looking good"
|
171
214
|
|
172
215
|
erb = <<-ERB
|
173
|
-
<% form_for :author, @author do |form| %>
|
216
|
+
<% form_for :author, @author, :url => '/do' do |form| %>
|
174
217
|
<h2>Posts</h2>
|
175
218
|
<% form.fields_for_association :posts, @author.posts[0..0] do |post| %>
|
176
219
|
<%= post.text_field :title %>
|
@@ -179,7 +222,7 @@ class FormHelperTest < ActionView::TestCase
|
|
179
222
|
ERB
|
180
223
|
|
181
224
|
js_fields = <<-HTML
|
182
|
-
<fieldset
|
225
|
+
<fieldset data-association="post" class="associated">
|
183
226
|
<input class="destroy" id="author_posts_attributes_new_post__destroy" name="author[posts_attributes][new_post][_destroy]" type="hidden" />
|
184
227
|
<input id="author_posts_attributes_new_post_title" name="author[posts_attributes][new_post][title]" size="30" type="text" />
|
185
228
|
<a class="remove" href="#">translation missing: en, remove</a>
|
@@ -211,7 +254,7 @@ class FormHelperTest < ActionView::TestCase
|
|
211
254
|
|
212
255
|
should 'raise error if model does not accepts nested attributes for association' do
|
213
256
|
assert_raises(NotImplementedError) do
|
214
|
-
form_for :comment, @comment do |form|
|
257
|
+
form_for :comment, @comment, :url => '/do' do |form|
|
215
258
|
form.fields_for_association(:author) {}
|
216
259
|
end
|
217
260
|
end
|
@@ -219,7 +262,7 @@ class FormHelperTest < ActionView::TestCase
|
|
219
262
|
|
220
263
|
should 'raise error if model does not accepts nested attributes for pluralized association' do
|
221
264
|
assert_raises(NotImplementedError) do
|
222
|
-
form_for :post, @post do |form|
|
265
|
+
form_for :post, @post, :url => '/do' do |form|
|
223
266
|
form.fields_for_association(:author) {}
|
224
267
|
end
|
225
268
|
end
|
@@ -227,7 +270,7 @@ class FormHelperTest < ActionView::TestCase
|
|
227
270
|
|
228
271
|
should 'raise argument error if no block is passed' do
|
229
272
|
assert_raises(ArgumentError) do
|
230
|
-
form_for :author, @author do |form|
|
273
|
+
form_for :author, @author, :url => '/do' do |form|
|
231
274
|
form.fields_for_association(:posts)
|
232
275
|
end
|
233
276
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry_forms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 2
|
10
|
+
version: 0.2.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Macario Ortega
|
@@ -15,11 +15,11 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-10-11 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
22
|
+
name: shoulda
|
23
23
|
prerelease: false
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
@@ -91,6 +91,6 @@ signing_key:
|
|
91
91
|
specification_version: 3
|
92
92
|
summary: Form builder additions for drier and localized forms, and association fields adding and removing with jQuery sweetness
|
93
93
|
test_files:
|
94
|
-
- test/support/models.rb
|
95
|
-
- test/helper.rb
|
96
94
|
- test/test_dry_forms.rb
|
95
|
+
- test/helper.rb
|
96
|
+
- test/support/models.rb
|