padrino-helpers-cj 0.12.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitignore +21 -0
  4. data/.yardopts +1 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +239 -0
  7. data/Rakefile +5 -0
  8. data/lib/padrino-helpers.rb +62 -0
  9. data/lib/padrino-helpers/asset_tag_helpers.rb +390 -0
  10. data/lib/padrino-helpers/form_builder/abstract_form_builder.rb +283 -0
  11. data/lib/padrino-helpers/form_builder/deprecated_builder_methods.rb +92 -0
  12. data/lib/padrino-helpers/form_builder/standard_form_builder.rb +40 -0
  13. data/lib/padrino-helpers/form_helpers.rb +633 -0
  14. data/lib/padrino-helpers/form_helpers/errors.rb +138 -0
  15. data/lib/padrino-helpers/form_helpers/options.rb +97 -0
  16. data/lib/padrino-helpers/form_helpers/security.rb +70 -0
  17. data/lib/padrino-helpers/format_helpers.rb +372 -0
  18. data/lib/padrino-helpers/locale/cs.yml +103 -0
  19. data/lib/padrino-helpers/locale/da.yml +91 -0
  20. data/lib/padrino-helpers/locale/de.yml +81 -0
  21. data/lib/padrino-helpers/locale/en.yml +103 -0
  22. data/lib/padrino-helpers/locale/es.yml +103 -0
  23. data/lib/padrino-helpers/locale/fr.yml +79 -0
  24. data/lib/padrino-helpers/locale/hu.yml +103 -0
  25. data/lib/padrino-helpers/locale/it.yml +89 -0
  26. data/lib/padrino-helpers/locale/ja.yml +103 -0
  27. data/lib/padrino-helpers/locale/lv.yml +103 -0
  28. data/lib/padrino-helpers/locale/nl.yml +82 -0
  29. data/lib/padrino-helpers/locale/no.yml +91 -0
  30. data/lib/padrino-helpers/locale/pl.yml +95 -0
  31. data/lib/padrino-helpers/locale/pt_br.yml +103 -0
  32. data/lib/padrino-helpers/locale/ro.yml +103 -0
  33. data/lib/padrino-helpers/locale/ru.yml +103 -0
  34. data/lib/padrino-helpers/locale/sv.yml +103 -0
  35. data/lib/padrino-helpers/locale/tr.yml +103 -0
  36. data/lib/padrino-helpers/locale/uk.yml +103 -0
  37. data/lib/padrino-helpers/locale/zh_cn.yml +103 -0
  38. data/lib/padrino-helpers/locale/zh_tw.yml +103 -0
  39. data/lib/padrino-helpers/number_helpers.rb +283 -0
  40. data/lib/padrino-helpers/output_helpers.rb +226 -0
  41. data/lib/padrino-helpers/output_helpers/abstract_handler.rb +61 -0
  42. data/lib/padrino-helpers/output_helpers/erb_handler.rb +27 -0
  43. data/lib/padrino-helpers/output_helpers/haml_handler.rb +25 -0
  44. data/lib/padrino-helpers/output_helpers/slim_handler.rb +18 -0
  45. data/lib/padrino-helpers/render_helpers.rb +63 -0
  46. data/lib/padrino-helpers/tag_helpers.rb +294 -0
  47. data/lib/padrino-helpers/translation_helpers.rb +36 -0
  48. data/lib/padrino/rendering.rb +397 -0
  49. data/lib/padrino/rendering/erubis_template.rb +66 -0
  50. data/lib/padrino/rendering/haml_template.rb +26 -0
  51. data/lib/padrino/rendering/slim_template.rb +20 -0
  52. data/padrino-helpers.gemspec +29 -0
  53. data/test/fixtures/apps/.components +6 -0
  54. data/test/fixtures/apps/.gitignore +7 -0
  55. data/test/fixtures/apps/render.rb +25 -0
  56. data/test/fixtures/apps/views/article/comment/show.slim +1 -0
  57. data/test/fixtures/apps/views/blog/post.erb +1 -0
  58. data/test/fixtures/apps/views/layouts/specific.erb +1 -0
  59. data/test/fixtures/apps/views/test/post.erb +1 -0
  60. data/test/fixtures/layouts/layout.erb +1 -0
  61. data/test/fixtures/markup_app/app.rb +87 -0
  62. data/test/fixtures/markup_app/views/button_to.erb +8 -0
  63. data/test/fixtures/markup_app/views/button_to.haml +5 -0
  64. data/test/fixtures/markup_app/views/button_to.slim +6 -0
  65. data/test/fixtures/markup_app/views/capture_concat.erb +14 -0
  66. data/test/fixtures/markup_app/views/capture_concat.haml +12 -0
  67. data/test/fixtures/markup_app/views/capture_concat.slim +12 -0
  68. data/test/fixtures/markup_app/views/content_for.erb +23 -0
  69. data/test/fixtures/markup_app/views/content_for.haml +19 -0
  70. data/test/fixtures/markup_app/views/content_for.slim +19 -0
  71. data/test/fixtures/markup_app/views/content_tag.erb +13 -0
  72. data/test/fixtures/markup_app/views/content_tag.haml +11 -0
  73. data/test/fixtures/markup_app/views/content_tag.slim +11 -0
  74. data/test/fixtures/markup_app/views/current_engine.erb +5 -0
  75. data/test/fixtures/markup_app/views/current_engine.haml +5 -0
  76. data/test/fixtures/markup_app/views/current_engine.slim +5 -0
  77. data/test/fixtures/markup_app/views/fields_for.erb +20 -0
  78. data/test/fixtures/markup_app/views/fields_for.haml +15 -0
  79. data/test/fixtures/markup_app/views/fields_for.slim +15 -0
  80. data/test/fixtures/markup_app/views/form_for.erb +72 -0
  81. data/test/fixtures/markup_app/views/form_for.haml +59 -0
  82. data/test/fixtures/markup_app/views/form_for.slim +59 -0
  83. data/test/fixtures/markup_app/views/form_tag.erb +95 -0
  84. data/test/fixtures/markup_app/views/form_tag.haml +78 -0
  85. data/test/fixtures/markup_app/views/form_tag.slim +79 -0
  86. data/test/fixtures/markup_app/views/link_to.erb +5 -0
  87. data/test/fixtures/markup_app/views/link_to.haml +4 -0
  88. data/test/fixtures/markup_app/views/link_to.slim +4 -0
  89. data/test/fixtures/markup_app/views/mail_to.erb +3 -0
  90. data/test/fixtures/markup_app/views/mail_to.haml +3 -0
  91. data/test/fixtures/markup_app/views/mail_to.slim +3 -0
  92. data/test/fixtures/markup_app/views/meta_tag.erb +3 -0
  93. data/test/fixtures/markup_app/views/meta_tag.haml +3 -0
  94. data/test/fixtures/markup_app/views/meta_tag.slim +3 -0
  95. data/test/fixtures/markup_app/views/partials/_erb.erb +1 -0
  96. data/test/fixtures/markup_app/views/partials/_haml.haml +1 -0
  97. data/test/fixtures/markup_app/views/partials/_slim.slim +1 -0
  98. data/test/fixtures/markup_app/views/simple_partial.erb +1 -0
  99. data/test/fixtures/markup_app/views/simple_partial.haml +1 -0
  100. data/test/fixtures/markup_app/views/simple_partial.slim +1 -0
  101. data/test/fixtures/render_app/app.rb +94 -0
  102. data/test/fixtures/render_app/views/_deep.erb +3 -0
  103. data/test/fixtures/render_app/views/_deep.haml +2 -0
  104. data/test/fixtures/render_app/views/_deep.slim +2 -0
  105. data/test/fixtures/render_app/views/_partial_block_erb.erb +10 -0
  106. data/test/fixtures/render_app/views/_partial_block_haml.haml +7 -0
  107. data/test/fixtures/render_app/views/_partial_block_slim.slim +7 -0
  108. data/test/fixtures/render_app/views/_unsafe.html.builder +2 -0
  109. data/test/fixtures/render_app/views/_unsafe_object.html.builder +2 -0
  110. data/test/fixtures/render_app/views/current_engine.haml +5 -0
  111. data/test/fixtures/render_app/views/current_engines/_erb.erb +1 -0
  112. data/test/fixtures/render_app/views/current_engines/_haml.haml +1 -0
  113. data/test/fixtures/render_app/views/current_engines/_slim.slim +1 -0
  114. data/test/fixtures/render_app/views/double_capture_erb.erb +3 -0
  115. data/test/fixtures/render_app/views/double_capture_haml.haml +2 -0
  116. data/test/fixtures/render_app/views/double_capture_slim.slim +2 -0
  117. data/test/fixtures/render_app/views/erb/test.erb +1 -0
  118. data/test/fixtures/render_app/views/explicit_engine.haml +5 -0
  119. data/test/fixtures/render_app/views/haml/test.haml +1 -0
  120. data/test/fixtures/render_app/views/render_block_erb.erb +5 -0
  121. data/test/fixtures/render_app/views/render_block_haml.haml +4 -0
  122. data/test/fixtures/render_app/views/render_block_slim.slim +4 -0
  123. data/test/fixtures/render_app/views/ruby_block_capture_erb.erb +1 -0
  124. data/test/fixtures/render_app/views/ruby_block_capture_haml.haml +1 -0
  125. data/test/fixtures/render_app/views/ruby_block_capture_slim.slim +1 -0
  126. data/test/fixtures/render_app/views/template/_user.haml +7 -0
  127. data/test/fixtures/render_app/views/template/haml_template.haml +1 -0
  128. data/test/fixtures/render_app/views/template/some_template.haml +2 -0
  129. data/test/fixtures/render_app/views/wrong_capture_erb.erb +3 -0
  130. data/test/fixtures/render_app/views/wrong_capture_haml.haml +2 -0
  131. data/test/fixtures/render_app/views/wrong_capture_slim.slim +2 -0
  132. data/test/helper.rb +131 -0
  133. data/test/test_asset_tag_helpers.rb +406 -0
  134. data/test/test_form_builder.rb +1216 -0
  135. data/test/test_form_helpers.rb +1056 -0
  136. data/test/test_format_helpers.rb +251 -0
  137. data/test/test_helpers.rb +10 -0
  138. data/test/test_locale.rb +20 -0
  139. data/test/test_number_helpers.rb +142 -0
  140. data/test/test_output_helpers.rb +157 -0
  141. data/test/test_render_helpers.rb +215 -0
  142. data/test/test_rendering.rb +694 -0
  143. data/test/test_rendering_extensions.rb +14 -0
  144. data/test/test_tag_helpers.rb +131 -0
  145. metadata +241 -0
@@ -0,0 +1,26 @@
1
+ module Haml
2
+ module Helpers
3
+ include XssMods
4
+ include ActionViewExtensions
5
+ end
6
+
7
+ module Util
8
+ def self.rails_xss_safe?
9
+ true
10
+ end
11
+ end
12
+ end
13
+
14
+ module Padrino
15
+ module Rendering
16
+ class HamlTemplate < Tilt::HamlTemplate
17
+ include SafeTemplate
18
+ end
19
+ end
20
+ end
21
+
22
+ Tilt.prefer(Padrino::Rendering::HamlTemplate, :haml)
23
+
24
+ Padrino::Rendering.engine_configurations[:haml] = {
25
+ :escape_html => true,
26
+ }
@@ -0,0 +1,20 @@
1
+ module Padrino
2
+ module Rendering
3
+ class SlimTemplate < Slim::Template
4
+ include SafeTemplate
5
+
6
+ def precompiled_preamble(locals)
7
+ "__in_slim_template = true\n" << super
8
+ end
9
+ end
10
+ end
11
+ end
12
+
13
+ Tilt.prefer(Padrino::Rendering::SlimTemplate, :slim)
14
+
15
+ Padrino::Rendering.engine_configurations[:slim] = {
16
+ :generator => Temple::Generators::RailsOutputBuffer,
17
+ :buffer => "@_out_buf",
18
+ :use_html_safe => true,
19
+ :disable_capture => true,
20
+ }
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env gem build
2
+ # encoding: utf-8
3
+
4
+ require File.expand_path("../../padrino-core/lib/padrino-core/version.rb", __FILE__)
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "padrino-helpers-cj"
8
+ s.rubyforge_project = "padrino-helpers"
9
+ s.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
10
+ s.email = "padrinorb@gmail.com"
11
+ s.summary = "Helpers for padrino"
12
+ s.homepage = "http://www.padrinorb.com"
13
+ s.description = "Tag helpers, asset helpers, form helpers, form builders and many more helpers for padrino"
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+ s.version = Padrino.version
16
+ s.date = Time.now.strftime("%Y-%m-%d")
17
+ s.license = "MIT"
18
+
19
+ s.extra_rdoc_files = Dir["*.rdoc"]
20
+ s.files = `git ls-files`.split("\n")
21
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
+ s.require_paths = ["lib"]
24
+ s.rdoc_options = ["--charset=UTF-8"]
25
+
26
+ s.add_dependency("padrino-support", Padrino.version)
27
+ s.add_dependency("tilt")
28
+ s.add_dependency("i18n", "~> 0.6", ">= 0.6.7")
29
+ end
@@ -0,0 +1,6 @@
1
+ ---
2
+ :test: bacon
3
+ :mock: mocha
4
+ :orm: datamapper
5
+ :renderer: erb
6
+ :script: jquery
@@ -0,0 +1,7 @@
1
+ .DS_Store
2
+ log/**/*
3
+ tmp/**/*
4
+ vendor/gems/gems
5
+ vendor/gems/specifications
6
+ vendor/gems/doc
7
+ vendor/gems/environment.rb
@@ -0,0 +1,25 @@
1
+ PADRINO_ROOT = File.dirname(__FILE__) unless defined? PADRINO_ROOT
2
+
3
+ class RenderDemo2 < Padrino::Application
4
+ register Padrino::Rendering
5
+
6
+ set :reload, true
7
+ end
8
+
9
+ RenderDemo2.controllers :blog do
10
+ get '/' do
11
+ render 'post'
12
+ end
13
+
14
+ get '/override' do
15
+ render 'post', :layout => RenderDemo2.layout_path('specific')
16
+ end
17
+ end
18
+
19
+ RenderDemo2.controllers :article, :comment do
20
+ get '/' do
21
+ render 'show'
22
+ end
23
+ end
24
+
25
+ Padrino.load!
@@ -0,0 +1 @@
1
+ <%= yield %> absolute layout
@@ -0,0 +1,87 @@
1
+ require 'padrino-core'
2
+
3
+ class MarkupDemo < Sinatra::Base
4
+ register Padrino::Helpers
5
+
6
+ configure do
7
+ set :logging, false
8
+ set :padrino_logging, false
9
+ set :environment, :test
10
+ set :root, File.dirname(__FILE__)
11
+ set :sessions, true
12
+ set :protect_from_csrf, true
13
+ end
14
+
15
+ get '/:engine/:file' do
16
+ show(params[:engine], params[:file].to_sym)
17
+ end
18
+
19
+ helpers do
20
+ # show :erb, :index
21
+ # show :haml, :index
22
+ def show(kind, template)
23
+ send kind.to_sym, template.to_sym
24
+ end
25
+
26
+ def captured_content(&block)
27
+ content_html = capture_html(&block)
28
+ "<p>#{content_html}</p>".html_safe
29
+ end
30
+
31
+ def concat_in_p(content_html)
32
+ concat_safe_content "<p>#{content_html}</p>"
33
+ end
34
+
35
+ def concat_if_block_is_template(name, &block)
36
+ concat_safe_content "<p class='is_template'>The #{name} block passed in is a template</p>" if block_is_template?(block)
37
+ end
38
+
39
+ def concat_ruby_not_template_block
40
+ concat_if_block_is_template('ruby') do
41
+ content_tag(:span, "This not a template block")
42
+ end
43
+ end
44
+
45
+ def content_tag_with_block
46
+ one = content_tag(:p) do
47
+ "one"
48
+ end
49
+ two = content_tag(:p) do
50
+ "two"
51
+ end
52
+ one << two
53
+ rescue
54
+ "<p>failed</p>".html_safe
55
+ end
56
+ end
57
+ end
58
+
59
+ class MarkupUser
60
+ def errors; { :fake => "must be valid", :second => "must be present", :third => "must be a number", :email => "must be an email"}; end
61
+ def session_id; 45; end
62
+ def gender; 'male'; end
63
+ def remember_me; '1'; end
64
+ def permission; Permission.new; end
65
+ def telephone; Telephone.new; end
66
+ def addresses; [Address.new('Greenfield', true), Address.new('Willowrun', false)]; end
67
+ end
68
+
69
+ class Telephone
70
+ def number; "62634576545"; end
71
+ end
72
+
73
+ class Address
74
+ attr_accessor :name
75
+ def initialize(name, existing); @name, @existing = name, existing; end
76
+ def new_record?; !@existing; end
77
+ def id; @existing ? 25 : nil; end
78
+ end
79
+
80
+ class Permission
81
+ def can_edit; true; end
82
+ def can_delete; false; end
83
+ end
84
+
85
+ module Outer
86
+ class UserAccount; end
87
+ end
@@ -0,0 +1,8 @@
1
+ <% button_to 'Foo button', '/foo', :class => 'foo-form' do %>
2
+ <% field_set_tag do %>
3
+ <%= hidden_field_tag :session_id, :value => "__secret__" %>
4
+ <%= label_tag :username %>
5
+ <% end %>
6
+ <% end %>
7
+ <%= content_tag(:p, 'button_to test', :id => 'test-point') %>
8
+ <%= button_to 'Bar button', '/bar' %>
@@ -0,0 +1,5 @@
1
+ = button_to 'Foo button', '/foo', :class => 'foo-form' do
2
+ = field_set_tag do
3
+ = label_tag :username
4
+ = content_tag(:p, 'button_to test', :id => 'test-point')
5
+ = button_to 'Bar button', '/bar'
@@ -0,0 +1,6 @@
1
+ = button_to 'Foo button', '/foo', :class => 'foo-form' do
2
+ = field_set_tag do
3
+ = hidden_field_tag :session_id, :value => "__secret__"
4
+ = label_tag :username
5
+ = content_tag(:p, 'button_to test', :id => 'test-point')
6
+ = button_to 'Bar button', '/bar'
@@ -0,0 +1,14 @@
1
+ <% @content = captured_content do %>
2
+ <span>Captured Line 1</span>
3
+ <span>Captured Line 2</span>
4
+ <% end %>
5
+ <%= @content %>
6
+
7
+ <% concat_in_p('Concat Line 3') %>
8
+
9
+ <% concat_if_block_is_template('erb') do %>
10
+ <span>This is erb</span>
11
+ <span>This is erb</span>
12
+ <% end %>
13
+
14
+ <% concat_ruby_not_template_block %>
@@ -0,0 +1,12 @@
1
+ - @content = captured_content do
2
+ %span Captured Line 1
3
+ %span Captured Line 2
4
+ = @content
5
+
6
+ = concat_in_p('Concat Line 3')
7
+
8
+ = concat_if_block_is_template('haml') do
9
+ %span This is haml
10
+ %span This is haml
11
+
12
+ = concat_ruby_not_template_block
@@ -0,0 +1,12 @@
1
+ - @content = captured_content do
2
+ span Captured Line 1
3
+ span Captured Line 2
4
+ = @content
5
+
6
+ = concat_in_p('Concat Line 3')
7
+
8
+ = concat_if_block_is_template('slim') do
9
+ span This is slim
10
+ span This is slim
11
+
12
+ = concat_ruby_not_template_block
@@ -0,0 +1,23 @@
1
+ <% content_for :demo do %>
2
+ <h1>This is content yielded from a content_for</h1>
3
+ <% end %>
4
+
5
+ <div class='demo'><%= yield_content :demo %></div>
6
+
7
+ <% content_for :demo2 do |fname, lname| %>
8
+ <h1>This is content yielded with name <%= fname + " " + lname %></h1>
9
+ <% end %>
10
+
11
+ <div class='demo2'><%= yield_content :demo2, "Johnny", "Smith" %></div>
12
+
13
+ <div class="demo_has_content"><%= content_for?(:demo).to_s %>
14
+ <div class="fake_has_content"><%= content_for?(:fake).to_s %>
15
+
16
+ <% content_for :demo3 do %>
17
+ <p class="duplication">One</p>
18
+ <% end %>
19
+ <% content_for :demo3, :flush => true do %>
20
+ <p class="duplication">Two</p>
21
+ <% end %>
22
+
23
+ <div class="demo3"><%= yield_content :demo3 %></div>
@@ -0,0 +1,19 @@
1
+ - content_for :demo do
2
+ %h1 This is content yielded from a content_for
3
+
4
+ .demo= yield_content :demo
5
+
6
+ - content_for :demo2 do |fname, lname|
7
+ %h1 This is content yielded with name #{fname + " " + lname}
8
+
9
+ .demo2= yield_content :demo2, "Johnny", "Smith"
10
+
11
+ .demo_has_content= content_for?(:demo)
12
+ .fake_has_content= content_for?(:fake)
13
+
14
+ - content_for :demo3 do
15
+ %p{:class => "duplication"} One
16
+ - content_for :demo3, :flush => true do
17
+ %p{:class => "duplication"} Two
18
+
19
+ .demo3= yield_content :demo3
@@ -0,0 +1,19 @@
1
+ - content_for :demo do
2
+ h1 This is content yielded from a content_for
3
+
4
+ .demo= yield_content :demo
5
+
6
+ - content_for :demo2 do |fname, lname|
7
+ h1 This is content yielded with name #{fname + " " + lname}
8
+
9
+ .demo2= yield_content :demo2, "Johnny", "Smith"
10
+
11
+ .demo_has_content= content_for?(:demo)
12
+ .fake_has_content= content_for?(:fake)
13
+
14
+ - content_for :demo3 do
15
+ p.duplication One
16
+ - content_for :demo3, :flush => true do
17
+ p.duplication Two
18
+
19
+ .demo3= yield_content :demo3
@@ -0,0 +1,13 @@
1
+ <%= content_tag :p, "Test 1", :class => 'test', :id => "test1" %>
2
+
3
+ <%= content_tag :p, "Test 2" %>
4
+
5
+ <% content_tag(:p, :class => 'test', :id => 'test3') do %>
6
+ <span>Test 3</span>
7
+ <% end %>
8
+
9
+ <% content_tag(:p) do %>
10
+ <span>Test 4</span>
11
+ <% end %>
12
+
13
+ <%= content_tag_with_block %>
@@ -0,0 +1,11 @@
1
+ = content_tag :p, "Test 1", :class => 'test', :id => "test1"
2
+
3
+ = content_tag :p, "Test 2"
4
+
5
+ = content_tag(:p, :class => 'test', :id => 'test3') do
6
+ %span Test 3
7
+
8
+ = content_tag(:p) do
9
+ %span Test 4
10
+
11
+ = content_tag_with_block
@@ -0,0 +1,11 @@
1
+ =content_tag :p, "Test 1", :class => 'test', :id => "test1"
2
+
3
+ =content_tag :p, "Test 2"
4
+
5
+ =content_tag(:p, :class => 'test', :id => 'test3') do
6
+ span Test 3
7
+
8
+ =content_tag(:p) do
9
+ span Test 4
10
+
11
+ = content_tag_with_block
@@ -0,0 +1,5 @@
1
+ <p class="start"><%= current_engine %></p>
2
+ <p class="haml"><%= haml :'partials/_haml' %></p>
3
+ <p class="erb"><%= erb :'partials/_erb' %></p>
4
+ <p class="slim"><%= slim :'partials/_slim' %></p>
5
+ <p class="end"><%= current_engine %></p>
@@ -0,0 +1,5 @@
1
+ %p.start= current_engine
2
+ %p.haml= haml :'partials/_haml'
3
+ %p.erb= erb :'partials/_erb'
4
+ %p.slim= slim :'partials/_slim'
5
+ %p.end= current_engine
@@ -0,0 +1,5 @@
1
+ p.start= current_engine
2
+ p.haml= haml :'partials/_haml'
3
+ p.erb= erb :'partials/_erb'
4
+ p.slim= slim :'partials/_slim'
5
+ p.end= current_engine
@@ -0,0 +1,20 @@
1
+ <% @user = MarkupUser.new %>
2
+ <% form_for @user , '/demo1', :id => 'demo-fields-for' do |f| %>
3
+ <%= f.text_field :gender %>
4
+ <% fields_for @user.permission do |permission| %>
5
+ <%= permission.check_box :can_edit %>
6
+ <%= permission.check_box :can_delete %>
7
+ <% end %>
8
+ <% f.fields_for :telephone do |child_form| %>
9
+ <%= child_form.label :number %>
10
+ <%= child_form.text_field :number %>
11
+ <% end %>
12
+ <% f.fields_for :addresses do |child_form| %>
13
+ <%= child_form.label :name %>
14
+ <%= child_form.text_field :name %>
15
+ <% unless child_form.object.new_record? %>
16
+ <%= child_form.check_box '_destroy' %>
17
+ <%= child_form.label '_destroy', :caption => 'Remove' %>
18
+ <% end %>
19
+ <% end %>
20
+ <% end %>
@@ -0,0 +1,15 @@
1
+ - @user = MarkupUser.new
2
+ = form_for @user , '/demo1', :id => 'demo-fields-for' do |f|
3
+ = f.text_field :gender
4
+ = fields_for @user.permission do |permission|
5
+ = permission.check_box :can_edit
6
+ = permission.check_box :can_delete
7
+ = f.fields_for :telephone do |child_form|
8
+ = child_form.label :number
9
+ = child_form.text_field :number
10
+ = f.fields_for :addresses do |child_form|
11
+ = child_form.label :name
12
+ = child_form.text_field :name
13
+ - unless child_form.object.new_record?
14
+ = child_form.check_box '_destroy'
15
+ = child_form.label '_destroy', :caption => 'Remove'