forme 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +28 -0
- data/MIT-LICENSE +1 -1
- data/README.rdoc +18 -2
- data/Rakefile +14 -8
- data/lib/forme.rb +65 -14
- data/lib/forme/rails.rb +99 -0
- data/lib/forme/sinatra.rb +41 -23
- data/lib/forme/version.rb +1 -1
- data/lib/sequel/plugins/forme.rb +22 -10
- data/spec/forme_spec.rb +44 -0
- data/spec/rails_integration_spec.rb +195 -0
- data/spec/sequel_helper.rb +71 -0
- data/spec/sequel_plugin_spec.rb +41 -96
- data/spec/sinatra_integration_spec.rb +94 -2
- metadata +31 -44
data/lib/forme/version.rb
CHANGED
data/lib/sequel/plugins/forme.rb
CHANGED
@@ -84,7 +84,7 @@ module Sequel # :nodoc:
|
|
84
84
|
options[:legend] = humanize(association)
|
85
85
|
end
|
86
86
|
end
|
87
|
-
|
87
|
+
_inputs(ins, options, &block)
|
88
88
|
else
|
89
89
|
yield
|
90
90
|
end
|
@@ -219,10 +219,7 @@ module Sequel # :nodoc:
|
|
219
219
|
|
220
220
|
# Add the label to the start of the array, returning the array.
|
221
221
|
def add_label(label, array)
|
222
|
-
if label
|
223
|
-
array.unshift(": ") unless label.is_a?(::Forme::Raw)
|
224
|
-
array.unshift(label)
|
225
|
-
end
|
222
|
+
array.unshift(form._tag(:span, {:class=>:label}, label)) if label
|
226
223
|
array
|
227
224
|
end
|
228
225
|
|
@@ -307,7 +304,7 @@ module Sequel # :nodoc:
|
|
307
304
|
label = opts.delete(:label)
|
308
305
|
val = opts.delete(:value)
|
309
306
|
wrapper, tag_wrapper = get_wrappers
|
310
|
-
radios = opts.delete(:options).map{|l, pk| _input(:radio, opts.merge(:value=>pk, :wrapper=>tag_wrapper, :label=>l, :checked=>(pk == val)))}
|
307
|
+
radios = opts.delete(:options).map{|l, pk| _input(:radio, opts.merge(:value=>pk, :id=>"#{form.namespaced_id(key)}_#{pk}", :wrapper=>tag_wrapper, :label=>l, :label_attr=>{:class=>:option}, :checked=>(pk == val)))}
|
311
308
|
add_label(label, radios)
|
312
309
|
wrapper ? wrapper.call(radios, _input(:radio, opts)) : radios
|
313
310
|
else
|
@@ -338,7 +335,7 @@ module Sequel # :nodoc:
|
|
338
335
|
label = opts.delete(:label)
|
339
336
|
val = opts.delete(:value)
|
340
337
|
wrapper, tag_wrapper = get_wrappers
|
341
|
-
cbs = opts.delete(:options).map{|l, pk| _input(:checkbox, opts.merge(:value=>pk, :wrapper=>tag_wrapper, :label=>l, :checked=>val.include?(pk), :no_hidden=>true))}
|
338
|
+
cbs = opts.delete(:options).map{|l, pk| _input(:checkbox, opts.merge(:value=>pk, :id=>"#{form.namespaced_id(field)}_#{pk}", :wrapper=>tag_wrapper, :label=>l, :label_attr=>{:class=>:option}, :checked=>val.include?(pk), :no_hidden=>true))}
|
342
339
|
add_label(label, cbs)
|
343
340
|
wrapper ? wrapper.call(cbs, _input(:checkbox, opts)) : cbs
|
344
341
|
else
|
@@ -371,8 +368,8 @@ module Sequel # :nodoc:
|
|
371
368
|
case opts[:as]
|
372
369
|
when :radio
|
373
370
|
wrapper, tag_wrapper = get_wrappers
|
374
|
-
true_opts = opts.merge(:value=>opts[:true_value]||'t', :label=>opts[:true_label]||'Yes', :error=>nil, :wrapper=>tag_wrapper, :wrapper_attr=>{})
|
375
|
-
false_opts = opts.merge(:value=>opts[:false_value]||'f', :label=>opts[:false_label]||'No', :wrapper=>tag_wrapper, :wrapper_attr=>{})
|
371
|
+
true_opts = opts.merge(:value=>opts[:true_value]||'t', :label=>opts[:true_label]||'Yes', :label_attr=>{:class=>:option}, :error=>nil, :wrapper=>tag_wrapper, :wrapper_attr=>{})
|
372
|
+
false_opts = opts.merge(:value=>opts[:false_value]||'f', :label=>opts[:false_label]||'No', :label_attr=>{:class=>:option}, :wrapper=>tag_wrapper, :wrapper_attr=>{})
|
376
373
|
if i = opts[:id]
|
377
374
|
true_opts[:id] = "#{i}_yes"
|
378
375
|
false_opts[:id] = "#{i}_no"
|
@@ -387,7 +384,7 @@ module Sequel # :nodoc:
|
|
387
384
|
v = opts[:value] || obj.send(field)
|
388
385
|
opts[:value] = (v ? 't' : 'f') unless v.nil?
|
389
386
|
opts[:add_blank] = true
|
390
|
-
opts[:options] = [['True', 't'], ['False', 'f']]
|
387
|
+
opts[:options] = [[opts[:true_label]||'True', opts[:true_value]||'t'], [opts[:false_label]||'False', opts[:false_value]||'f']]
|
391
388
|
_input(:select, opts)
|
392
389
|
else
|
393
390
|
opts[:checked] = obj.send(field)
|
@@ -453,6 +450,20 @@ module Sequel # :nodoc:
|
|
453
450
|
end
|
454
451
|
end
|
455
452
|
|
453
|
+
# Helper module used for Sequel/Sinatra forms. Necessary for
|
454
|
+
# proper subform handling when using such forms with partials.
|
455
|
+
module SinatraSequelForm
|
456
|
+
# Capture the inside of the inputs, injecting it into the template
|
457
|
+
# if a block is given, or returning it as a string if not.
|
458
|
+
def subform(*, &block)
|
459
|
+
if block
|
460
|
+
capture(block){super}
|
461
|
+
else
|
462
|
+
capture{super}
|
463
|
+
end
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
456
467
|
module InstanceMethods
|
457
468
|
# Configure the +form+ with support for <tt>Sequel::Model</tt>
|
458
469
|
# specific code, such as support for nested attributes.
|
@@ -460,6 +471,7 @@ module Sequel # :nodoc:
|
|
460
471
|
form.extend(SequelForm)
|
461
472
|
form.nested_associations = []
|
462
473
|
form.namespaces = [model.send(:underscore, model.name)]
|
474
|
+
form.extend(SinatraSequelForm) if defined?(::Forme::Sinatra::Form) && form.is_a?(::Forme::Sinatra::Form)
|
463
475
|
end
|
464
476
|
|
465
477
|
# Return <tt>Forme::Input</tt> instance based on the given arguments.
|
data/spec/forme_spec.rb
CHANGED
@@ -42,6 +42,10 @@ describe "Forme plain forms" do
|
|
42
42
|
@f.input(:text, :placeholder=>"foo").to_s.should == '<input placeholder="foo" type="text"/>'
|
43
43
|
end
|
44
44
|
|
45
|
+
specify "should use :style option as attribute" do
|
46
|
+
@f.input(:text, :style=>"foo").to_s.should == '<input style="foo" type="text"/>'
|
47
|
+
end
|
48
|
+
|
45
49
|
specify "should allow arbitrary attributes using the :attr option" do
|
46
50
|
@f.input(:text, :attr=>{:bar=>"foo"}).to_s.should == '<input bar="foo" type="text"/>'
|
47
51
|
end
|
@@ -62,6 +66,11 @@ describe "Forme plain forms" do
|
|
62
66
|
@f.input(:text, :data=>{:bar=>"baz"}, :attr=>{:"data-bar"=>"foo"}).to_s.should == '<input data-bar="foo" type="text"/>'
|
63
67
|
end
|
64
68
|
|
69
|
+
specify "should use :size and :maxlength options as attributes for text inputs" do
|
70
|
+
@f.input(:text, :size=>5, :maxlength=>10).to_s.should == '<input maxlength="10" size="5" type="text"/>'
|
71
|
+
@f.input(:textarea, :size=>5, :maxlength=>10).to_s.should == '<textarea></textarea>'
|
72
|
+
end
|
73
|
+
|
65
74
|
specify "should create hidden input with value 0 for each checkbox with a name" do
|
66
75
|
@f.input(:checkbox, :name=>"foo").to_s.should == '<input name="foo" type="hidden" value="0"/><input name="foo" type="checkbox"/>'
|
67
76
|
end
|
@@ -89,6 +98,12 @@ describe "Forme plain forms" do
|
|
89
98
|
|
90
99
|
specify "should create textarea tag" do
|
91
100
|
@f.input(:textarea).to_s.should == '<textarea></textarea>'
|
101
|
+
@f.input(:textarea, :value=>'a').to_s.should == '<textarea>a</textarea>'
|
102
|
+
end
|
103
|
+
|
104
|
+
specify "should use :cols and :rows options as attributes for textarea inputs" do
|
105
|
+
@f.input(:text, :cols=>5, :rows=>10).to_s.should == '<input type="text"/>'
|
106
|
+
@f.input(:textarea, :cols=>5, :rows=>10).to_s.should == '<textarea cols="5" rows="10"></textarea>'
|
92
107
|
end
|
93
108
|
|
94
109
|
specify "should create select tag" do
|
@@ -181,6 +196,18 @@ describe "Forme plain forms" do
|
|
181
196
|
@f.input(:text, :label=>'Foo', :value=>'foo', :label_attr=>{:class=>'bar'}).to_s.should == '<label class="bar">Foo: <input type="text" value="foo"/></label>'
|
182
197
|
end
|
183
198
|
|
199
|
+
specify "should handle implicit labels with checkboxes" do
|
200
|
+
@f.input(:checkbox, :label=>'Foo', :value=>'foo', :name=>'a').to_s.should == '<input name="a" type="hidden" value="0"/><label><input name="a" type="checkbox" value="foo"/> Foo</label>'
|
201
|
+
end
|
202
|
+
|
203
|
+
specify "should handle implicit labels with :label_position=>:after" do
|
204
|
+
@f.input(:text, :label=>'Foo', :value=>'foo', :label_position=>:after).to_s.should == '<label><input type="text" value="foo"/> Foo</label>'
|
205
|
+
end
|
206
|
+
|
207
|
+
specify "should handle implicit labels with checkboxes with :label_position=>:before" do
|
208
|
+
@f.input(:checkbox, :label=>'Foo', :value=>'foo', :name=>'a', :label_position=>:before).to_s.should == '<input name="a" type="hidden" value="0"/><label>Foo <input name="a" type="checkbox" value="foo"/></label>'
|
209
|
+
end
|
210
|
+
|
184
211
|
specify "should automatically note the input has errors if :error option is used" do
|
185
212
|
@f.input(:text, :error=>'Bad Stuff!', :value=>'foo').to_s.should == '<input class="error" type="text" value="foo"/><span class="error_message">Bad Stuff!</span>'
|
186
213
|
end
|
@@ -286,6 +313,18 @@ describe "Forme plain forms" do
|
|
286
313
|
@f.input(:textarea, :labeler=>:explicit, :label=>'bar', :id=>:foo).to_s.should == '<label for="foo">bar</label><textarea id="foo"></textarea>'
|
287
314
|
end
|
288
315
|
|
316
|
+
specify "inputs handle explicit labels with :label_position=>:after" do
|
317
|
+
@f.input(:textarea, :labeler=>:explicit, :label=>'bar', :id=>:foo, :label_position=>:after).to_s.should == '<textarea id="foo"></textarea><label for="foo">bar</label>'
|
318
|
+
end
|
319
|
+
|
320
|
+
specify "should handle explicit labels with checkboxes" do
|
321
|
+
@f.input(:checkbox, :labeler=>:explicit, :label=>'Foo', :value=>'foo', :name=>'a', :id=>'bar').to_s.should == '<input id="bar_hidden" name="a" type="hidden" value="0"/><input id="bar" name="a" type="checkbox" value="foo"/><label for="bar">Foo</label>'
|
322
|
+
end
|
323
|
+
|
324
|
+
specify "should handle explicit labels with checkboxes with :label_position=>:before" do
|
325
|
+
@f.input(:checkbox, :labeler=>:explicit, :label=>'Foo', :value=>'foo', :name=>'a', :id=>'bar', :label_position=>:before).to_s.should == '<label for="bar">Foo</label><input id="bar_hidden" name="a" type="hidden" value="0"/><input id="bar" name="a" type="checkbox" value="foo"/>'
|
326
|
+
end
|
327
|
+
|
289
328
|
specify "inputs should accept a :error_handler option to use a custom error_handler" do
|
290
329
|
@f.input(:textarea, :error_handler=>proc{|t, i| [t, "!!! #{i.opts[:error]}"]}, :error=>'bar', :id=>:foo).to_s.should == '<textarea class="error" id="foo"></textarea>!!! bar'
|
291
330
|
end
|
@@ -547,6 +586,11 @@ describe "Forme.form DSL" do
|
|
547
586
|
Forme.form{|f| f.should be_a_kind_of(Forme::Form)}
|
548
587
|
end
|
549
588
|
|
589
|
+
specify "should respect an array of classes" do
|
590
|
+
Forme.form(:class=>[:foo, :bar]).to_s.should == '<form class="foo bar"></form>'
|
591
|
+
Forme.form(:class=>[:foo, [:bar, :baz]]).to_s.should == '<form class="foo bar baz"></form>'
|
592
|
+
end
|
593
|
+
|
550
594
|
specify "should have inputs called instead the block be added to the existing form" do
|
551
595
|
Forme.form{|f| f.input(:text)}.to_s.should == '<form><input type="text"/></form>'
|
552
596
|
end
|
@@ -0,0 +1,195 @@
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
2
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'sequel_helper.rb')
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'action_controller/railtie'
|
6
|
+
require 'forme/rails'
|
7
|
+
|
8
|
+
class FormeRails < Rails::Application
|
9
|
+
config.secret_token = routes.append { match ':action' , :controller=>'forme' }.inspect
|
10
|
+
config.active_support.deprecation = :stderr
|
11
|
+
config.middleware.delete(ActionDispatch::ShowExceptions)
|
12
|
+
config.threadsafe!
|
13
|
+
initialize!
|
14
|
+
end
|
15
|
+
|
16
|
+
class FormeController < ActionController::Base
|
17
|
+
helper Forme::Rails::ERB
|
18
|
+
|
19
|
+
def index
|
20
|
+
render :inline => <<END
|
21
|
+
<%= forme([:foo, :bar], :action=>'/baz') do |f| %>
|
22
|
+
<p>FBB</p>
|
23
|
+
<%= f.input(:first) %>
|
24
|
+
<%= f.input(:last) %>
|
25
|
+
<%= f.button('Save') %>
|
26
|
+
<% end %>
|
27
|
+
END
|
28
|
+
end
|
29
|
+
|
30
|
+
def inputs_block
|
31
|
+
render :inline => <<END
|
32
|
+
<%= forme([:foo, :bar], :action=>'/baz') do |f| %>
|
33
|
+
<%= f.inputs(:legend=>'FBB') do %>
|
34
|
+
<%= f.input(:last) %>
|
35
|
+
<% end %>
|
36
|
+
<% end %>
|
37
|
+
END
|
38
|
+
end
|
39
|
+
|
40
|
+
def inputs_block_wrapper
|
41
|
+
render :inline => <<END
|
42
|
+
<%= forme([:foo, :bar], {:action=>'/baz'}, :inputs_wrapper=>:fieldset_ol) do |f| %>
|
43
|
+
<%= f.inputs(:legend=>'FBB') do %>
|
44
|
+
<%= f.input(:last) %>
|
45
|
+
<% end %>
|
46
|
+
<% end %>
|
47
|
+
END
|
48
|
+
end
|
49
|
+
|
50
|
+
def nest
|
51
|
+
render :inline => <<END
|
52
|
+
<%= forme([:foo, :bar], :action=>'/baz') do |f| %>
|
53
|
+
<%= f.tag(:p, {}, 'FBB') %>
|
54
|
+
<%= f.tag(:div) do %>
|
55
|
+
<%= f.input(:first) %>
|
56
|
+
<%= f.input(:last) %>
|
57
|
+
<% end %>
|
58
|
+
|
59
|
+
<% end %>
|
60
|
+
END
|
61
|
+
end
|
62
|
+
|
63
|
+
def nest_sep
|
64
|
+
@nest = <<END
|
65
|
+
n1
|
66
|
+
<%= f.tag(:div) do %>
|
67
|
+
n2
|
68
|
+
<%= f.input(:first) %>
|
69
|
+
<%= f.input(:last) %>
|
70
|
+
n3
|
71
|
+
<% end %>
|
72
|
+
n4
|
73
|
+
<%= f.inputs([:first, :last], :legend=>'Foo') %>
|
74
|
+
n5
|
75
|
+
END
|
76
|
+
render :inline => <<END
|
77
|
+
0
|
78
|
+
<%= forme([:foo, :bar], :action=>'/baz') do |f| %>
|
79
|
+
1
|
80
|
+
<%= f.tag(:p, {}, 'FBB') %>
|
81
|
+
2
|
82
|
+
<%= render(:inline =>@nest, :locals=>{:f=>f}) %>
|
83
|
+
3
|
84
|
+
<% end %>
|
85
|
+
4
|
86
|
+
END
|
87
|
+
end
|
88
|
+
|
89
|
+
def nest_seq
|
90
|
+
@album = Album.load(:name=>'N', :copies_sold=>2, :id=>1)
|
91
|
+
@album.associations[:artist] = Artist.load(:name=>'A', :id=>2)
|
92
|
+
@nest = <<END
|
93
|
+
n1
|
94
|
+
<%= f.subform(:artist) do %>
|
95
|
+
n2
|
96
|
+
<%= f.input(:name2) %>
|
97
|
+
n3
|
98
|
+
<% end %>
|
99
|
+
n4
|
100
|
+
<%= f.subform(:artist, :inputs=>[:name3], :legend=>'Bar') %>
|
101
|
+
n5
|
102
|
+
END
|
103
|
+
render :inline => <<END
|
104
|
+
0
|
105
|
+
<%= forme(@album, :action=>'/baz') do |f| %>
|
106
|
+
1
|
107
|
+
<%= f.subform(:artist, :inputs=>[:name], :legend=>'Foo') %>
|
108
|
+
2
|
109
|
+
<%= render(:inline=>@nest, :locals=>{:f=>f}) %>
|
110
|
+
3
|
111
|
+
<% end %>
|
112
|
+
4
|
113
|
+
END
|
114
|
+
end
|
115
|
+
|
116
|
+
def hash
|
117
|
+
render :inline => "<%= forme({:action=>'/baz'}, :obj=>[:foo]) do |f| %> <%= f.input(:first) %> <% end %>"
|
118
|
+
end
|
119
|
+
|
120
|
+
def legend
|
121
|
+
render :inline => <<END
|
122
|
+
<%= forme([:foo, :bar], :action=>'/baz') do |f| %>
|
123
|
+
<p>FBB</p>
|
124
|
+
<%= f.inputs([:first, :last], :legend=>'Foo') %>
|
125
|
+
<p>FBB2</p>
|
126
|
+
<% end %>
|
127
|
+
END
|
128
|
+
end
|
129
|
+
|
130
|
+
def combined
|
131
|
+
render :inline => <<END
|
132
|
+
<%= forme([:foo, :bar], {:action=>'/baz'}, :inputs=>[:first], :button=>'xyz', :legend=>'123') do |f| %>
|
133
|
+
<p>FBB</p>
|
134
|
+
<%= f.input(:last) %>
|
135
|
+
<% end %>
|
136
|
+
END
|
137
|
+
end
|
138
|
+
|
139
|
+
def noblock
|
140
|
+
render :inline => "<%= forme([:foo, :bar], {:action=>'/baz'}, :inputs=>[:first], :button=>'xyz', :legend=>'123') %>"
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "Forme Rails integration" do
|
145
|
+
def sin_get(path)
|
146
|
+
res = FormeRails.call(@rack.merge('PATH_INFO'=>path))
|
147
|
+
p res unless res[0] == 200
|
148
|
+
res[2].join.gsub(/\s+/, ' ').strip
|
149
|
+
end
|
150
|
+
before do
|
151
|
+
o = Object.new
|
152
|
+
def o.puts(*) end
|
153
|
+
@rack = {'rack.input'=>'', 'REQUEST_METHOD'=>'GET', 'rack.errors'=>o}
|
154
|
+
end
|
155
|
+
|
156
|
+
specify "#form should add start and end tags and yield Forme::Form instance" do
|
157
|
+
sin_get('/index').should == '<form action="/baz"> <p>FBB</p> <input id="first" name="first" type="text" value="foo"/> <input id="last" name="last" type="text" value="bar"/> <input type="submit" value="Save"/> </form>'
|
158
|
+
end
|
159
|
+
|
160
|
+
specify "#form should have inputs work with a block" do
|
161
|
+
sin_get('/inputs_block').should == '<form action="/baz"> <fieldset class="inputs"><legend>FBB</legend> <input id="last" name="last" type="text" value="bar"/> </fieldset></form>'
|
162
|
+
end
|
163
|
+
|
164
|
+
specify "#form should have inputs with fieldset_ol wrapper work with block" do
|
165
|
+
sin_get('/inputs_block_wrapper').should == '<form action="/baz"> <fieldset class="inputs"><legend>FBB</legend><ol> <input id="last" name="last" type="text" value="bar"/> </ol></fieldset></form>'
|
166
|
+
end
|
167
|
+
|
168
|
+
specify "#form should add start and end tags and yield Forme::Form instance" do
|
169
|
+
sin_get('/nest').should == '<form action="/baz"> <p>FBB</p> <div> <input id="first" name="first" type="text" value="foo"/> <input id="last" name="last" type="text" value="bar"/> </div> </form>'
|
170
|
+
end
|
171
|
+
|
172
|
+
specify "#form should correctly handle situation where multiple templates are used with same form object" do
|
173
|
+
sin_get('/nest_sep').should == "0 <form action=\"/baz\"> 1 <p>FBB</p> 2 n1 <div> n2 <input id=\"first\" name=\"first\" type=\"text\" value=\"foo\"/> <input id=\"last\" name=\"last\" type=\"text\" value=\"bar\"/> n3 </div> n4 <fieldset class=\"inputs\"><legend>Foo</legend><input id=\"first\" name=\"first\" type=\"text\" value=\"foo\"/><input id=\"last\" name=\"last\" type=\"text\" value=\"bar\"/></fieldset> n5 3 </form>4"
|
174
|
+
end
|
175
|
+
|
176
|
+
specify "#form should correctly handle situation Sequel integration with subforms where multiple templates are used with same form object" do
|
177
|
+
sin_get('/nest_seq').should == "0 <form action=\"/baz\" class=\"forme album\" method=\"post\"> 1 <input id=\"album_artist_attributes_id\" name=\"album[artist_attributes][id]\" type=\"hidden\" value=\"2\"/><fieldset class=\"inputs\"><legend>Foo</legend><label>Name: <input id=\"album_artist_attributes_name\" name=\"album[artist_attributes][name]\" type=\"text\" value=\"A\"/></label></fieldset> 2 n1 <input id=\"album_artist_attributes_id\" name=\"album[artist_attributes][id]\" type=\"hidden\" value=\"2\"/> n2 <label>Name2: <input id=\"album_artist_attributes_name2\" name=\"album[artist_attributes][name2]\" type=\"text\" value=\"A2\"/></label> n3 n4 <input id=\"album_artist_attributes_id\" name=\"album[artist_attributes][id]\" type=\"hidden\" value=\"2\"/><fieldset class=\"inputs\"><legend>Bar</legend><label>Name3: <input id=\"album_artist_attributes_name3\" name=\"album[artist_attributes][name3]\" type=\"text\" value=\"A3\"/></label></fieldset> n5 3 </form>4"
|
178
|
+
end
|
179
|
+
|
180
|
+
specify "#form should accept two hashes instead of requiring obj as first argument" do
|
181
|
+
sin_get('/hash').should == '<form action="/baz"> <input id="first" name="first" type="text" value="foo"/> </form>'
|
182
|
+
end
|
183
|
+
|
184
|
+
specify "#form should deal with emitted code" do
|
185
|
+
sin_get('/legend').should == '<form action="/baz"> <p>FBB</p> <fieldset class="inputs"><legend>Foo</legend><input id="first" name="first" type="text" value="foo"/><input id="last" name="last" type="text" value="bar"/></fieldset> <p>FBB2</p> </form>'
|
186
|
+
end
|
187
|
+
|
188
|
+
specify "#form should work with :inputs, :button, and :legend options" do
|
189
|
+
sin_get('/combined').should == '<form action="/baz"><fieldset class="inputs"><legend>123</legend><input id="first" name="first" type="text" value="foo"/></fieldset> <p>FBB</p> <input id="last" name="last" type="text" value="bar"/> <input type="submit" value="xyz"/></form>'
|
190
|
+
end
|
191
|
+
|
192
|
+
specify "#form should work without a block" do
|
193
|
+
sin_get('/noblock').should == '<form action="/baz"><fieldset class="inputs"><legend>123</legend><input id="first" name="first" type="text" value="foo"/></fieldset><input type="submit" value="xyz"/></form>'
|
194
|
+
end
|
195
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sequel/no_core_ext'
|
3
|
+
|
4
|
+
DB = Sequel.sqlite
|
5
|
+
Sequel.default_timezone = :utc
|
6
|
+
DB.create_table(:artists) do
|
7
|
+
primary_key :id
|
8
|
+
String :name
|
9
|
+
end
|
10
|
+
DB.create_table(:albums) do
|
11
|
+
primary_key :id
|
12
|
+
foreign_key :artist_id, :artists
|
13
|
+
String :name
|
14
|
+
TrueClass :gold
|
15
|
+
TrueClass :platinum, :null=>false, :default=>false
|
16
|
+
Date :release_date
|
17
|
+
DateTime :created_at
|
18
|
+
Integer :copies_sold
|
19
|
+
end
|
20
|
+
DB.create_table(:album_infos) do
|
21
|
+
primary_key :id
|
22
|
+
foreign_key :album_id, :albums
|
23
|
+
String :info
|
24
|
+
end
|
25
|
+
DB.create_table(:tracks) do
|
26
|
+
primary_key :id
|
27
|
+
foreign_key :album_id, :albums
|
28
|
+
String :name
|
29
|
+
end
|
30
|
+
DB.create_table(:tags) do
|
31
|
+
primary_key :id
|
32
|
+
String :name
|
33
|
+
end
|
34
|
+
DB.create_table(:albums_tags) do
|
35
|
+
foreign_key :album_id, :albums
|
36
|
+
foreign_key :tag_id, :tags
|
37
|
+
end
|
38
|
+
|
39
|
+
a = DB[:artists].insert(:name=>'a')
|
40
|
+
d = DB[:artists].insert(:name=>'d')
|
41
|
+
b = DB[:albums].insert(:name=>'b', :artist_id=>a, :gold=>false, :release_date=>Date.new(2011, 6, 5), :created_at=>Date.new(2011, 6, 5), :copies_sold=>10)
|
42
|
+
DB[:tracks].insert(:name=>'m', :album_id=>b)
|
43
|
+
DB[:tracks].insert(:name=>'n', :album_id=>b)
|
44
|
+
c = DB[:albums].insert(:name=>'c', :artist_id=>d, :gold=>true, :platinum=>true)
|
45
|
+
DB[:tracks].insert(:name=>'o', :album_id=>c)
|
46
|
+
s = DB[:tags].insert(:name=>'s')
|
47
|
+
t = DB[:tags].insert(:name=>'t')
|
48
|
+
u = DB[:tags].insert(:name=>'u')
|
49
|
+
[[b, s], [b, t], [c, t]].each{|k, v| DB[:albums_tags].insert(k, v)}
|
50
|
+
|
51
|
+
Sequel::Model.plugin :forme
|
52
|
+
class Album < Sequel::Model
|
53
|
+
many_to_one :artist, :order=>:name
|
54
|
+
one_to_one :album_info
|
55
|
+
one_to_many :tracks
|
56
|
+
many_to_many :tags
|
57
|
+
|
58
|
+
def artist_name
|
59
|
+
artist.name if artist
|
60
|
+
end
|
61
|
+
end
|
62
|
+
class Artist < Sequel::Model
|
63
|
+
one_to_many :albums
|
64
|
+
def idname() "#{id}#{name}" end
|
65
|
+
def name2() "#{name}2" end
|
66
|
+
def name3() "#{name}3" end
|
67
|
+
end
|
68
|
+
class Track < Sequel::Model; end
|
69
|
+
class Tag < Sequel::Model; end
|
70
|
+
class AlbumInfo < Sequel::Model; end
|
71
|
+
|
data/spec/sequel_plugin_spec.rb
CHANGED
@@ -1,79 +1,11 @@
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'sequel'
|
5
|
-
|
6
|
-
DB = Sequel.sqlite
|
7
|
-
Sequel.default_timezone = :utc
|
8
|
-
DB.create_table(:artists) do
|
9
|
-
primary_key :id
|
10
|
-
String :name
|
11
|
-
end
|
12
|
-
DB.create_table(:albums) do
|
13
|
-
primary_key :id
|
14
|
-
foreign_key :artist_id, :artists
|
15
|
-
String :name
|
16
|
-
TrueClass :gold
|
17
|
-
TrueClass :platinum, :null=>false, :default=>false
|
18
|
-
Date :release_date
|
19
|
-
DateTime :created_at
|
20
|
-
Integer :copies_sold
|
21
|
-
end
|
22
|
-
DB.create_table(:album_infos) do
|
23
|
-
primary_key :id
|
24
|
-
foreign_key :album_id, :albums
|
25
|
-
String :info
|
26
|
-
end
|
27
|
-
DB.create_table(:tracks) do
|
28
|
-
primary_key :id
|
29
|
-
foreign_key :album_id, :albums
|
30
|
-
String :name
|
31
|
-
end
|
32
|
-
DB.create_table(:tags) do
|
33
|
-
primary_key :id
|
34
|
-
String :name
|
35
|
-
end
|
36
|
-
DB.create_table(:albums_tags) do
|
37
|
-
foreign_key :album_id, :albums
|
38
|
-
foreign_key :tag_id, :tags
|
39
|
-
end
|
40
|
-
|
41
|
-
a = DB[:artists].insert(:name=>'a')
|
42
|
-
d = DB[:artists].insert(:name=>'d')
|
43
|
-
b = DB[:albums].insert(:name=>'b', :artist_id=>a, :gold=>false, :release_date=>Date.new(2011, 6, 5), :created_at=>Date.new(2011, 6, 5), :copies_sold=>10)
|
44
|
-
DB[:tracks].insert(:name=>'m', :album_id=>b)
|
45
|
-
DB[:tracks].insert(:name=>'n', :album_id=>b)
|
46
|
-
c = DB[:albums].insert(:name=>'c', :artist_id=>d, :gold=>true, :platinum=>true)
|
47
|
-
DB[:tracks].insert(:name=>'o', :album_id=>c)
|
48
|
-
s = DB[:tags].insert(:name=>'s')
|
49
|
-
t = DB[:tags].insert(:name=>'t')
|
50
|
-
u = DB[:tags].insert(:name=>'u')
|
51
|
-
[[b, s], [b, t], [c, t]].each{|k, v| DB[:albums_tags].insert(k, v)}
|
52
|
-
|
53
|
-
Sequel::Model.plugin :forme
|
54
|
-
class Album < Sequel::Model
|
55
|
-
many_to_one :artist, :order=>:name
|
56
|
-
one_to_one :album_info
|
57
|
-
one_to_many :tracks
|
58
|
-
many_to_many :tags
|
59
|
-
|
60
|
-
def artist_name
|
61
|
-
artist.name if artist
|
62
|
-
end
|
63
|
-
end
|
64
|
-
class Artist < Sequel::Model
|
65
|
-
one_to_many :albums
|
66
|
-
def idname() "#{id}#{name}" end
|
67
|
-
end
|
68
|
-
class Track < Sequel::Model; end
|
69
|
-
class Tag < Sequel::Model; end
|
70
|
-
class AlbumInfo < Sequel::Model; end
|
2
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'sequel_helper.rb')
|
71
3
|
|
72
4
|
describe "Forme Sequel::Model forms" do
|
73
5
|
before do
|
74
|
-
@ab = Album[
|
6
|
+
@ab = Album[1]
|
75
7
|
@b = Forme::Form.new(@ab)
|
76
|
-
@ac = Album[
|
8
|
+
@ac = Album[2]
|
77
9
|
@c = Forme::Form.new(@ac)
|
78
10
|
end
|
79
11
|
|
@@ -85,6 +17,11 @@ describe "Forme Sequel::Model forms" do
|
|
85
17
|
@b.form(:class=>:foo, :method=>:get).to_s.should == '<form class="foo forme album" method="get"></form>'
|
86
18
|
end
|
87
19
|
|
20
|
+
specify "should allow an array of classes" do
|
21
|
+
@b.form(:class=>[:foo, :bar]).to_s.should == '<form class="foo bar forme album" method="post"></form>'
|
22
|
+
@b.form(:class=>[:foo, [:bar, :baz]]).to_s.should == '<form class="foo bar baz forme album" method="post"></form>'
|
23
|
+
end
|
24
|
+
|
88
25
|
specify "should use a text field for strings" do
|
89
26
|
@b.input(:name).to_s.should == '<label>Name: <input id="album_name" name="album[name]" type="text" value="b"/></label>'
|
90
27
|
@c.input(:name).to_s.should == '<label>Name: <input id="album_name" name="album[name]" type="text" value="c"/></label>'
|
@@ -138,38 +75,46 @@ describe "Forme Sequel::Model forms" do
|
|
138
75
|
@c.input(:gold).to_s.should == '<label>Gold: <select id="album_gold" name="album[gold]"><option value=""></option><option selected="selected" value="t">True</option><option value="f">False</option></select></label>'
|
139
76
|
end
|
140
77
|
|
78
|
+
specify "should respect :true_label and :false_label options for tri-valued boolean fields" do
|
79
|
+
@b.input(:gold, :true_label=>"Foo", :false_label=>"Bar").to_s.should == '<label>Gold: <select id="album_gold" name="album[gold]"><option value=""></option><option value="t">Foo</option><option selected="selected" value="f">Bar</option></select></label>'
|
80
|
+
end
|
81
|
+
|
82
|
+
specify "should respect :true_value and :false_value options for tri-valued boolean fields" do
|
83
|
+
@b.input(:gold, :true_value=>"Foo", :false_value=>"Bar").to_s.should == '<label>Gold: <select id="album_gold" name="album[gold]"><option value=""></option><option value="Foo">True</option><option value="Bar">False</option></select></label>'
|
84
|
+
end
|
85
|
+
|
141
86
|
specify "should use a checkbox for dual-valued boolean fields" do
|
142
|
-
@b.input(:platinum).to_s.should == '<
|
143
|
-
@c.input(:platinum).to_s.should == '<
|
87
|
+
@b.input(:platinum).to_s.should == '<input id="album_platinum_hidden" name="album[platinum]" type="hidden" value="f"/><label><input id="album_platinum" name="album[platinum]" type="checkbox" value="t"/> Platinum</label>'
|
88
|
+
@c.input(:platinum).to_s.should == '<input id="album_platinum_hidden" name="album[platinum]" type="hidden" value="f"/><label><input checked="checked" id="album_platinum" name="album[platinum]" type="checkbox" value="t"/> Platinum</label>'
|
144
89
|
end
|
145
90
|
|
146
91
|
specify "should use radio buttons for boolean fields if :as=>:radio is used" do
|
147
|
-
@b.input(:platinum, :as=>:radio).to_s.should == '
|
148
|
-
@c.input(:platinum, :as=>:radio).to_s.should == '
|
92
|
+
@b.input(:platinum, :as=>:radio).to_s.should == '<span class="label">Platinum</span><label class="option"><input id="album_platinum_yes" name="album[platinum]" type="radio" value="t"/> Yes</label><label class="option"><input checked="checked" id="album_platinum_no" name="album[platinum]" type="radio" value="f"/> No</label>'
|
93
|
+
@c.input(:platinum, :as=>:radio).to_s.should == '<span class="label">Platinum</span><label class="option"><input checked="checked" id="album_platinum_yes" name="album[platinum]" type="radio" value="t"/> Yes</label><label class="option"><input id="album_platinum_no" name="album[platinum]" type="radio" value="f"/> No</label>'
|
149
94
|
end
|
150
95
|
|
151
96
|
specify "should wrap both inputs if :as=>:radio is used" do
|
152
97
|
@b = Forme::Form.new(@ab, :wrapper=>:li)
|
153
|
-
@b.input(:platinum, :as=>:radio).to_s.should == '<li class="boolean">Platinum
|
154
|
-
@b.input(:platinum, :as=>:radio, :wrapper=>:div, :tag_wrapper=>:span).to_s.should == '<div class="boolean">Platinum
|
98
|
+
@b.input(:platinum, :as=>:radio).to_s.should == '<li class="boolean"><span class="label">Platinum</span><label class="option"><input id="album_platinum_yes" name="album[platinum]" type="radio" value="t"/> Yes</label><label class="option"><input checked="checked" id="album_platinum_no" name="album[platinum]" type="radio" value="f"/> No</label></li>'
|
99
|
+
@b.input(:platinum, :as=>:radio, :wrapper=>:div, :tag_wrapper=>:span).to_s.should == '<div class="boolean"><span class="label">Platinum</span><span><label class="option"><input id="album_platinum_yes" name="album[platinum]" type="radio" value="t"/> Yes</label></span><span><label class="option"><input checked="checked" id="album_platinum_no" name="album[platinum]" type="radio" value="f"/> No</label></span></div>'
|
155
100
|
end
|
156
101
|
|
157
102
|
specify "should handle errors on radio buttons for boolean fields if :as=>:radio is used" do
|
158
103
|
@ab.errors.add(:platinum, 'foo')
|
159
|
-
@b.input(:platinum, :as=>:radio).to_s.should == '
|
104
|
+
@b.input(:platinum, :as=>:radio).to_s.should == '<span class="label">Platinum</span><label class="option"><input id="album_platinum_yes" name="album[platinum]" type="radio" value="t"/> Yes</label><label class="option"><input checked="checked" class="error" id="album_platinum_no" name="album[platinum]" type="radio" value="f"/> No</label><span class="error_message">foo</span>'
|
160
105
|
end
|
161
106
|
|
162
107
|
specify "should handle Raw :label options if :as=>:radio is used" do
|
163
|
-
@b.input(:platinum, :as=>:radio, :label=>'Foo:<br />'.extend(Forme::Raw)).to_s.should == 'Foo:<br
|
164
|
-
@b.input(:platinum, :as=>:radio, :label=>'Foo:<br />').to_s.should == 'Foo:<br />
|
108
|
+
@b.input(:platinum, :as=>:radio, :label=>'Foo:<br />'.extend(Forme::Raw)).to_s.should == '<span class="label">Foo:<br /></span><label class="option"><input id="album_platinum_yes" name="album[platinum]" type="radio" value="t"/> Yes</label><label class="option"><input checked="checked" id="album_platinum_no" name="album[platinum]" type="radio" value="f"/> No</label>'
|
109
|
+
@b.input(:platinum, :as=>:radio, :label=>'Foo:<br />').to_s.should == '<span class="label">Foo:<br /></span><label class="option"><input id="album_platinum_yes" name="album[platinum]" type="radio" value="t"/> Yes</label><label class="option"><input checked="checked" id="album_platinum_no" name="album[platinum]" type="radio" value="f"/> No</label>'
|
165
110
|
end
|
166
111
|
|
167
112
|
specify "should respect :true_label and :false_label options for boolean fields if :as=>:radio is used" do
|
168
|
-
@b.input(:platinum, :as=>:radio, :true_label=>"Foo", :false_label=>"Bar").to_s.should == '
|
113
|
+
@b.input(:platinum, :as=>:radio, :true_label=>"Foo", :false_label=>"Bar").to_s.should == '<span class="label">Platinum</span><label class="option"><input id="album_platinum_yes" name="album[platinum]" type="radio" value="t"/> Foo</label><label class="option"><input checked="checked" id="album_platinum_no" name="album[platinum]" type="radio" value="f"/> Bar</label>'
|
169
114
|
end
|
170
115
|
|
171
116
|
specify "should respect :true_value and :false_value options for boolean fields if :as=>:radio is used" do
|
172
|
-
@b.input(:platinum, :as=>:radio, :true_value=>"Foo", :false_value=>"Bar").to_s.should == '
|
117
|
+
@b.input(:platinum, :as=>:radio, :true_value=>"Foo", :false_value=>"Bar").to_s.should == '<span class="label">Platinum</span><label class="option"><input id="album_platinum_yes" name="album[platinum]" type="radio" value="Foo"/> Yes</label><label class="option"><input checked="checked" id="album_platinum_no" name="album[platinum]" type="radio" value="Bar"/> No</label>'
|
173
118
|
end
|
174
119
|
|
175
120
|
specify "should use a select box for many_to_one associations" do
|
@@ -186,23 +131,23 @@ describe "Forme Sequel::Model forms" do
|
|
186
131
|
end
|
187
132
|
|
188
133
|
specify "should use a set of radio buttons for many_to_one associations with :as=>:radio option" do
|
189
|
-
@b.input(:artist, :as=>:radio).to_s.should == '
|
190
|
-
@c.input(:artist, :as=>:radio).to_s.should == '
|
134
|
+
@b.input(:artist, :as=>:radio).to_s.should == '<span class="label">Artist</span><label class="option"><input checked="checked" id="album_artist_id_1" name="album[artist_id]" type="radio" value="1"/> a</label><label class="option"><input id="album_artist_id_2" name="album[artist_id]" type="radio" value="2"/> d</label>'
|
135
|
+
@c.input(:artist, :as=>:radio).to_s.should == '<span class="label">Artist</span><label class="option"><input id="album_artist_id_1" name="album[artist_id]" type="radio" value="1"/> a</label><label class="option"><input checked="checked" id="album_artist_id_2" name="album[artist_id]" type="radio" value="2"/> d</label>'
|
191
136
|
end
|
192
137
|
|
193
138
|
specify "should handle Raw label for many_to_one associations with :as=>:radio option" do
|
194
|
-
@b.input(:artist, :as=>:radio, :label=>'Foo:<br />'.extend(Forme::Raw)).to_s.should == 'Foo:<br
|
195
|
-
@b.input(:artist, :as=>:radio, :label=>'Foo<br />').to_s.should == 'Foo<br />
|
139
|
+
@b.input(:artist, :as=>:radio, :label=>'Foo:<br />'.extend(Forme::Raw)).to_s.should == '<span class="label">Foo:<br /></span><label class="option"><input checked="checked" id="album_artist_id_1" name="album[artist_id]" type="radio" value="1"/> a</label><label class="option"><input id="album_artist_id_2" name="album[artist_id]" type="radio" value="2"/> d</label>'
|
140
|
+
@b.input(:artist, :as=>:radio, :label=>'Foo<br />').to_s.should == '<span class="label">Foo<br /></span><label class="option"><input checked="checked" id="album_artist_id_1" name="album[artist_id]" type="radio" value="1"/> a</label><label class="option"><input id="album_artist_id_2" name="album[artist_id]" type="radio" value="2"/> d</label>'
|
196
141
|
end
|
197
142
|
|
198
143
|
specify "should correctly use the forms wrapper for wrapping radio buttons for many_to_one associations with :as=>:radio option" do
|
199
144
|
@b = Forme::Form.new(@ab, :wrapper=>:li)
|
200
|
-
@b.input(:artist, :as=>:radio).to_s.should == '<li class="many_to_one">Artist
|
145
|
+
@b.input(:artist, :as=>:radio).to_s.should == '<li class="many_to_one"><span class="label">Artist</span><label class="option"><input checked="checked" id="album_artist_id_1" name="album[artist_id]" type="radio" value="1"/> a</label><label class="option"><input id="album_artist_id_2" name="album[artist_id]" type="radio" value="2"/> d</label></li>'
|
201
146
|
end
|
202
147
|
|
203
148
|
specify "should support custom wrappers for many_to_one associations with :as=>:radio via :tag_wrapper option" do
|
204
149
|
@b = Forme::Form.new(@ab, :wrapper=>:li)
|
205
|
-
@b.input(:artist, :as=>:radio, :wrapper=>proc{|t, i| i.tag(:div, {}, [t])}, :tag_wrapper=>proc{|t, i| i.tag(:span, {}, [t])}).to_s.should == '<div>Artist
|
150
|
+
@b.input(:artist, :as=>:radio, :wrapper=>proc{|t, i| i.tag(:div, {}, [t])}, :tag_wrapper=>proc{|t, i| i.tag(:span, {}, [t])}).to_s.should == '<div><span class="label">Artist</span><span><label class="option"><input checked="checked" id="album_artist_id_1" name="album[artist_id]" type="radio" value="1"/> a</label></span><span><label class="option"><input id="album_artist_id_2" name="album[artist_id]" type="radio" value="2"/> d</label></span></div>'
|
206
151
|
end
|
207
152
|
|
208
153
|
specify "should respect an :options entry" do
|
@@ -254,28 +199,28 @@ describe "Forme Sequel::Model forms" do
|
|
254
199
|
end
|
255
200
|
|
256
201
|
specify "should use multiple checkboxes for one_to_many associations if :as=>:checkbox" do
|
257
|
-
@b.input(:tracks, :as=>:checkbox).to_s.should == '
|
258
|
-
@c.input(:tracks, :as=>:checkbox).to_s.should == '
|
202
|
+
@b.input(:tracks, :as=>:checkbox).to_s.should == '<span class="label">Tracks</span><label class="option"><input checked="checked" id="album_track_pks_1" name="album[track_pks][]" type="checkbox" value="1"/> m</label><label class="option"><input checked="checked" id="album_track_pks_2" name="album[track_pks][]" type="checkbox" value="2"/> n</label><label class="option"><input id="album_track_pks_3" name="album[track_pks][]" type="checkbox" value="3"/> o</label>'
|
203
|
+
@c.input(:tracks, :as=>:checkbox).to_s.should == '<span class="label">Tracks</span><label class="option"><input id="album_track_pks_1" name="album[track_pks][]" type="checkbox" value="1"/> m</label><label class="option"><input id="album_track_pks_2" name="album[track_pks][]" type="checkbox" value="2"/> n</label><label class="option"><input checked="checked" id="album_track_pks_3" name="album[track_pks][]" type="checkbox" value="3"/> o</label>'
|
259
204
|
end
|
260
205
|
|
261
206
|
specify "should use multiple checkboxes for many_to_many associations if :as=>:checkbox" do
|
262
|
-
@b.input(:tags, :as=>:checkbox).to_s.should == '
|
263
|
-
@c.input(:tags, :as=>:checkbox).to_s.should == '
|
207
|
+
@b.input(:tags, :as=>:checkbox).to_s.should == '<span class="label">Tags</span><label class="option"><input checked="checked" id="album_tag_pks_1" name="album[tag_pks][]" type="checkbox" value="1"/> s</label><label class="option"><input checked="checked" id="album_tag_pks_2" name="album[tag_pks][]" type="checkbox" value="2"/> t</label><label class="option"><input id="album_tag_pks_3" name="album[tag_pks][]" type="checkbox" value="3"/> u</label>'
|
208
|
+
@c.input(:tags, :as=>:checkbox).to_s.should == '<span class="label">Tags</span><label class="option"><input id="album_tag_pks_1" name="album[tag_pks][]" type="checkbox" value="1"/> s</label><label class="option"><input checked="checked" id="album_tag_pks_2" name="album[tag_pks][]" type="checkbox" value="2"/> t</label><label class="option"><input id="album_tag_pks_3" name="album[tag_pks][]" type="checkbox" value="3"/> u</label>'
|
264
209
|
end
|
265
210
|
|
266
211
|
specify "should handle Raw label for associations with :as=>:checkbox" do
|
267
|
-
@b.input(:tracks, :as=>:checkbox, :label=>'Foo<br />:'.extend(Forme::Raw)).to_s.should == 'Foo<br
|
268
|
-
@b.input(:tracks, :as=>:checkbox, :label=>'Foo<br />').to_s.should == 'Foo<br />
|
212
|
+
@b.input(:tracks, :as=>:checkbox, :label=>'Foo<br />:'.extend(Forme::Raw)).to_s.should == '<span class="label">Foo<br />:</span><label class="option"><input checked="checked" id="album_track_pks_1" name="album[track_pks][]" type="checkbox" value="1"/> m</label><label class="option"><input checked="checked" id="album_track_pks_2" name="album[track_pks][]" type="checkbox" value="2"/> n</label><label class="option"><input id="album_track_pks_3" name="album[track_pks][]" type="checkbox" value="3"/> o</label>'
|
213
|
+
@b.input(:tracks, :as=>:checkbox, :label=>'Foo<br />').to_s.should == '<span class="label">Foo<br /></span><label class="option"><input checked="checked" id="album_track_pks_1" name="album[track_pks][]" type="checkbox" value="1"/> m</label><label class="option"><input checked="checked" id="album_track_pks_2" name="album[track_pks][]" type="checkbox" value="2"/> n</label><label class="option"><input id="album_track_pks_3" name="album[track_pks][]" type="checkbox" value="3"/> o</label>'
|
269
214
|
end
|
270
215
|
|
271
216
|
specify "should correctly use the forms wrapper for wrapping radio buttons for one_to_many associations with :as=>:checkbox option" do
|
272
217
|
@b = Forme::Form.new(@ab, :wrapper=>:li)
|
273
|
-
@b.input(:tracks, :as=>:checkbox).to_s.should == '<li class="one_to_many">Tracks
|
218
|
+
@b.input(:tracks, :as=>:checkbox).to_s.should == '<li class="one_to_many"><span class="label">Tracks</span><label class="option"><input checked="checked" id="album_track_pks_1" name="album[track_pks][]" type="checkbox" value="1"/> m</label><label class="option"><input checked="checked" id="album_track_pks_2" name="album[track_pks][]" type="checkbox" value="2"/> n</label><label class="option"><input id="album_track_pks_3" name="album[track_pks][]" type="checkbox" value="3"/> o</label></li>'
|
274
219
|
end
|
275
220
|
|
276
221
|
specify "should support custom wrappers for one_to_many associations with :as=>:checkbox via :tag_wrapper option" do
|
277
222
|
@b = Forme::Form.new(@ab, :wrapper=>:li)
|
278
|
-
@b.input(:tracks, :as=>:checkbox, :wrapper=>proc{|t, i| i.tag(:div, i.opts[:wrapper_attr], [t])}, :tag_wrapper=>proc{|t, i| i.tag(:span, {}, [t])}).to_s.should == '<div class="one_to_many">Tracks
|
223
|
+
@b.input(:tracks, :as=>:checkbox, :wrapper=>proc{|t, i| i.tag(:div, i.opts[:wrapper_attr], [t])}, :tag_wrapper=>proc{|t, i| i.tag(:span, {}, [t])}).to_s.should == '<div class="one_to_many"><span class="label">Tracks</span><span><label class="option"><input checked="checked" id="album_track_pks_1" name="album[track_pks][]" type="checkbox" value="1"/> m</label></span><span><label class="option"><input checked="checked" id="album_track_pks_2" name="album[track_pks][]" type="checkbox" value="2"/> n</label></span><span><label class="option"><input id="album_track_pks_3" name="album[track_pks][]" type="checkbox" value="3"/> o</label></span></div>'
|
279
224
|
end
|
280
225
|
|
281
226
|
specify "should use a text field methods not backed by columns" do
|