dry_forms 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/dry_forms/builder_additions.rb +14 -5
- data/test/test_dry_forms.rb +57 -8
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -15,12 +15,21 @@ module DryForms
|
|
15
15
|
label = label attribute, label_text
|
16
16
|
field = send name, attribute, *(args << opts)
|
17
17
|
|
18
|
-
|
18
|
+
errors =
|
19
|
+
if @object and name == 'file_field' # Not specked, for paperclip
|
20
|
+
%w(file_name content_type file_size).map { |f| @object.errors["#{attribute}_#{f}".to_sym] }.unshift @object.errors[attribute]
|
21
|
+
elsif @object
|
22
|
+
@object.errors[attribute]
|
23
|
+
end
|
24
|
+
|
25
|
+
DryForms.field_markup label, field, [*errors].compact, html_opts
|
19
26
|
end
|
20
27
|
end
|
21
28
|
|
22
|
-
def fields_for_association association,
|
29
|
+
def fields_for_association association, *args, &block
|
30
|
+
options = args.extract_options!
|
23
31
|
association = association.to_s
|
32
|
+
objects = args.first ? [*args.first] : @object.send(association)
|
24
33
|
|
25
34
|
unless @object.respond_to? "#{association.pluralize}_attributes="
|
26
35
|
raise NotImplementedError, "Please call `accepts_nested_attributes_for :#{association.pluralize}` in your `#{@object.class}` Model"
|
@@ -30,7 +39,7 @@ module DryForms
|
|
30
39
|
|
31
40
|
association_class = @object.class.reflect_on_association(association.to_sym).klass
|
32
41
|
singular_name = association.singularize
|
33
|
-
fields =
|
42
|
+
fields = objects.map{ |obj| association_fields(association, obj, &block) }.join
|
34
43
|
new_object = @object.send(association).build options.delete(:default_attributes) || {}
|
35
44
|
js_fields = association_fields association, new_object, :child_index => "new_#{singular_name}", &block
|
36
45
|
|
@@ -38,7 +47,7 @@ module DryForms
|
|
38
47
|
<div id="#{association}">
|
39
48
|
#{fields}
|
40
49
|
#{@template.javascript_tag "var fields_for_#{singular_name} = '#{js_fields.strip.gsub /\n\s+|\n/, ''}';"}
|
41
|
-
<a href="#" class="add_fields" data-association="#{singular_name}">#{I18n.t '
|
50
|
+
<a href="#" class="add_fields" data-association="#{singular_name}">#{I18n.t 'add', :model => association_class.human_name}</a>
|
42
51
|
</div>
|
43
52
|
HTML
|
44
53
|
end
|
@@ -58,7 +67,7 @@ module DryForms
|
|
58
67
|
custom_fields_for association.to_sym, object, opts do |fields|
|
59
68
|
@template.concat fields.hidden_field :_destroy, :class => 'destroy'
|
60
69
|
yield fields
|
61
|
-
@template.concat %{<a class="remove" href="#">#{I18n.t "
|
70
|
+
@template.concat %{<a class="remove" href="#">#{I18n.t "remove"}</a>}
|
62
71
|
end
|
63
72
|
end
|
64
73
|
end
|
data/test/test_dry_forms.rb
CHANGED
@@ -75,6 +75,11 @@ class FormHelperTest < ActionView::TestCase
|
|
75
75
|
end
|
76
76
|
|
77
77
|
context 'field for associations' do
|
78
|
+
setup do
|
79
|
+
@author.posts = []
|
80
|
+
Post.destroy_all
|
81
|
+
end
|
82
|
+
|
78
83
|
should 'render js fields' do
|
79
84
|
erb = <<-ERB
|
80
85
|
<% form_for :author, @author do |form| %>
|
@@ -89,7 +94,7 @@ class FormHelperTest < ActionView::TestCase
|
|
89
94
|
<fieldset class="associated" data-association="post">
|
90
95
|
<input class="destroy" id="author_posts_attributes_new_post__destroy" name="author[posts_attributes][new_post][_destroy]" type="hidden" />
|
91
96
|
<input id="author_posts_attributes_new_post_title" name="author[posts_attributes][new_post][title]" size="30" type="text" />
|
92
|
-
<a class="remove" href="#">translation missing: en,
|
97
|
+
<a class="remove" href="#">translation missing: en, remove</a>
|
93
98
|
</fieldset>
|
94
99
|
HTML
|
95
100
|
|
@@ -102,7 +107,7 @@ class FormHelperTest < ActionView::TestCase
|
|
102
107
|
var fields_for_post = '#{js_fields.gsub(/\n\s+/, '').strip}';
|
103
108
|
//]]>
|
104
109
|
</script>
|
105
|
-
<a href="#" class="add_fields" data-association="post">translation missing: en,
|
110
|
+
<a href="#" class="add_fields" data-association="post">translation missing: en, add</a>
|
106
111
|
</div>
|
107
112
|
</form>
|
108
113
|
HTML
|
@@ -127,7 +132,7 @@ class FormHelperTest < ActionView::TestCase
|
|
127
132
|
<fieldset class="associated" data-association="post">
|
128
133
|
<input class="destroy" id="author_posts_attributes_new_post__destroy" name="author[posts_attributes][new_post][_destroy]" type="hidden" />
|
129
134
|
<input id="author_posts_attributes_new_post_title" name="author[posts_attributes][new_post][title]" size="30" type="text" />
|
130
|
-
<a class="remove" href="#">translation missing: en,
|
135
|
+
<a class="remove" href="#">translation missing: en, remove</a>
|
131
136
|
</fieldset>
|
132
137
|
HTML
|
133
138
|
|
@@ -138,27 +143,71 @@ class FormHelperTest < ActionView::TestCase
|
|
138
143
|
<fieldset class="associated" data-association="post">
|
139
144
|
<input class="destroy" name="author[posts_attributes][0][_destroy]" id="author_posts_attributes_0__destroy" type="hidden" />
|
140
145
|
<input name="author[posts_attributes][0][title]" size="30" id="author_posts_attributes_0_title" type="text" value="Hello World" />
|
141
|
-
<a href="#" class="remove">translation missing: en,
|
142
|
-
<input name="author[posts_attributes][0][id]" id="author_posts_attributes_0_id" type="hidden" value="
|
146
|
+
<a href="#" class="remove">translation missing: en, remove</a>
|
147
|
+
<input name="author[posts_attributes][0][id]" id="author_posts_attributes_0_id" type="hidden" value="#{ @author.posts.first.id }" />
|
143
148
|
</fieldset>
|
144
149
|
<fieldset class="associated" data-association="post">
|
145
150
|
<input class="destroy" name="author[posts_attributes][1][_destroy]" id="author_posts_attributes_1__destroy" type="hidden" />
|
146
151
|
<input name="author[posts_attributes][1][title]" size="30" id="author_posts_attributes_1_title" type="text" value="Hello World 2" />
|
147
|
-
<a href="#" class="remove">translation missing: en,
|
148
|
-
<input name="author[posts_attributes][1][id]" id="author_posts_attributes_1_id" type="hidden" value="
|
152
|
+
<a href="#" class="remove">translation missing: en, remove</a>
|
153
|
+
<input name="author[posts_attributes][1][id]" id="author_posts_attributes_1_id" type="hidden" value="#{ @author.posts.last.id }" />
|
149
154
|
</fieldset>
|
150
155
|
<script type="text/javascript">
|
151
156
|
//<![CDATA[
|
152
157
|
var fields_for_post = '#{js_fields.gsub(/\n\s+/, '').strip}';
|
153
158
|
//]]>
|
154
159
|
</script>
|
155
|
-
<a href="#" class="add_fields" data-association="post">translation missing: en,
|
160
|
+
<a href="#" class="add_fields" data-association="post">translation missing: en, add</a>
|
156
161
|
</div>
|
157
162
|
</form>
|
158
163
|
HTML
|
159
164
|
|
160
165
|
assert_dom_equal html, render(:inline => erb)
|
161
166
|
end
|
167
|
+
|
168
|
+
should 'render field for existing associations passing objects' do
|
169
|
+
@author.posts.create! :title => "Hello World", :body => "Looking good"
|
170
|
+
@author.posts.create! :title => "Hello World 2", :body => "Looking good"
|
171
|
+
|
172
|
+
erb = <<-ERB
|
173
|
+
<% form_for :author, @author do |form| %>
|
174
|
+
<h2>Posts</h2>
|
175
|
+
<% form.fields_for_association :posts, @author.posts[0..0] do |post| %>
|
176
|
+
<%= post.text_field :title %>
|
177
|
+
<% end %>
|
178
|
+
<% end %>
|
179
|
+
ERB
|
180
|
+
|
181
|
+
js_fields = <<-HTML
|
182
|
+
<fieldset class="associated" data-association="post">
|
183
|
+
<input class="destroy" id="author_posts_attributes_new_post__destroy" name="author[posts_attributes][new_post][_destroy]" type="hidden" />
|
184
|
+
<input id="author_posts_attributes_new_post_title" name="author[posts_attributes][new_post][title]" size="30" type="text" />
|
185
|
+
<a class="remove" href="#">translation missing: en, remove</a>
|
186
|
+
</fieldset>
|
187
|
+
HTML
|
188
|
+
|
189
|
+
html = <<-HTML
|
190
|
+
<form method="post" action="/do">
|
191
|
+
<h2>Posts</h2>
|
192
|
+
<div id="posts">
|
193
|
+
<fieldset class="associated" data-association="post">
|
194
|
+
<input class="destroy" name="author[posts_attributes][0][_destroy]" id="author_posts_attributes_0__destroy" type="hidden" />
|
195
|
+
<input name="author[posts_attributes][0][title]" size="30" id="author_posts_attributes_0_title" type="text" value="Hello World" />
|
196
|
+
<a href="#" class="remove">translation missing: en, remove</a>
|
197
|
+
<input name="author[posts_attributes][0][id]" id="author_posts_attributes_0_id" type="hidden" value="#{ @author.posts.first.id }" />
|
198
|
+
</fieldset>
|
199
|
+
<script type="text/javascript">
|
200
|
+
//<![CDATA[
|
201
|
+
var fields_for_post = '#{js_fields.gsub(/\n\s+/, '').strip}';
|
202
|
+
//]]>
|
203
|
+
</script>
|
204
|
+
<a href="#" class="add_fields" data-association="post">translation missing: en, add</a>
|
205
|
+
</div>
|
206
|
+
</form>
|
207
|
+
HTML
|
208
|
+
|
209
|
+
assert_dom_equal html, render(:inline => erb)
|
210
|
+
end
|
162
211
|
|
163
212
|
should 'raise error if model does not accepts nested attributes for association' do
|
164
213
|
assert_raises(NotImplementedError) do
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 2
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Macario Ortega
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-08
|
17
|
+
date: 2010-09-08 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|