middleman 2.0.7 → 2.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +0 -1
  3. data/CHANGELOG +8 -0
  4. data/Gemfile +1 -1
  5. data/features/data.feature +6 -1
  6. data/features/markdown.feature +7 -0
  7. data/features/sprockets.feature +11 -1
  8. data/features/sprockets_gems.feature +3 -3
  9. data/fixtures/sprockets-app/source/jquery_include.js +1 -0
  10. data/fixtures/test-app/config.rb +2 -0
  11. data/fixtures/test-app/source/data2.html.liquid +1 -0
  12. data/fixtures/test-app/source/javascripts/multiple_engines.js.coffee.erb +1 -0
  13. data/fixtures/test-app/source/markdown.html.markdown +1 -0
  14. data/lib/middleman.rb +0 -6
  15. data/lib/middleman/base.rb +6 -1
  16. data/lib/middleman/builder.rb +6 -4
  17. data/lib/middleman/core_extensions/data.rb +35 -5
  18. data/lib/middleman/core_extensions/front_matter.rb +9 -2
  19. data/lib/middleman/core_extensions/sprockets.rb +25 -1
  20. data/lib/middleman/renderers/markdown.rb +25 -2
  21. data/lib/middleman/version.rb +1 -1
  22. data/middleman.gemspec +7 -6
  23. metadata +112 -251
  24. data/lib/middleman/vendor/padrino-core-0.10.0/.document +0 -5
  25. data/lib/middleman/vendor/padrino-core-0.10.0/.gitignore +0 -22
  26. data/lib/middleman/vendor/padrino-core-0.10.0/LICENSE +0 -20
  27. data/lib/middleman/vendor/padrino-core-0.10.0/README.rdoc +0 -294
  28. data/lib/middleman/vendor/padrino-core-0.10.0/Rakefile +0 -5
  29. data/lib/middleman/vendor/padrino-core-0.10.0/bin/padrino +0 -9
  30. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core.rb +0 -119
  31. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application.rb +0 -259
  32. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application/rendering.rb +0 -228
  33. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application/routing.rb +0 -821
  34. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application/showexceptions.rb +0 -18
  35. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/caller.rb +0 -45
  36. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/adapter.rb +0 -24
  37. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/base.rb +0 -152
  38. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/console.rb +0 -20
  39. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/rake.rb +0 -24
  40. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/rake_tasks.rb +0 -59
  41. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/command.rb +0 -27
  42. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/images/404.png +0 -0
  43. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/images/500.png +0 -0
  44. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/loader.rb +0 -182
  45. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/cz.yml +0 -30
  46. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/da.yml +0 -30
  47. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/de.yml +0 -30
  48. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/en.yml +0 -30
  49. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/es.yml +0 -30
  50. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/fr.yml +0 -30
  51. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/hu.yml +0 -30
  52. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/it.yml +0 -37
  53. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/ja.yml +0 -30
  54. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/nl.yml +0 -30
  55. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/no.yml +0 -31
  56. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/pl.yml +0 -30
  57. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/pt_br.yml +0 -37
  58. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/ru.yml +0 -30
  59. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/tr.yml +0 -30
  60. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/uk.yml +0 -30
  61. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/zh_cn.yml +0 -30
  62. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/zh_tw.yml +0 -30
  63. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/logger.rb +0 -344
  64. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/mounter.rb +0 -192
  65. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/reloader.rb +0 -247
  66. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/router.rb +0 -79
  67. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/server.rb +0 -70
  68. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/support_lite.rb +0 -135
  69. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/tasks.rb +0 -23
  70. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/version.rb +0 -15
  71. data/lib/middleman/vendor/padrino-core-0.10.0/padrino-core.gemspec +0 -38
  72. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/.components +0 -6
  73. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/.gitignore +0 -7
  74. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/complex.rb +0 -27
  75. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/simple.rb +0 -33
  76. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/a.rb +0 -9
  77. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/b.rb +0 -4
  78. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/c.rb +0 -1
  79. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/circular/e.rb +0 -13
  80. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/circular/f.rb +0 -2
  81. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/circular/g.rb +0 -2
  82. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/d.rb +0 -4
  83. data/lib/middleman/vendor/padrino-core-0.10.0/test/helper.rb +0 -101
  84. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_application.rb +0 -83
  85. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_core.rb +0 -79
  86. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_dependencies.rb +0 -44
  87. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_filters.rb +0 -266
  88. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_logger.rb +0 -91
  89. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_mounter.rb +0 -176
  90. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_reloader_complex.rb +0 -66
  91. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_reloader_simple.rb +0 -97
  92. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_rendering.rb +0 -437
  93. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_router.rb +0 -146
  94. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_routing.rb +0 -1491
  95. data/lib/middleman/vendor/padrino-helpers-0.10.0/.document +0 -5
  96. data/lib/middleman/vendor/padrino-helpers-0.10.0/.gitignore +0 -21
  97. data/lib/middleman/vendor/padrino-helpers-0.10.0/LICENSE +0 -20
  98. data/lib/middleman/vendor/padrino-helpers-0.10.0/README.rdoc +0 -239
  99. data/lib/middleman/vendor/padrino-helpers-0.10.0/Rakefile +0 -5
  100. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers.rb +0 -51
  101. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/asset_tag_helpers.rb +0 -288
  102. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/form_builder/abstract_form_builder.rb +0 -220
  103. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/form_builder/standard_form_builder.rb +0 -43
  104. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/form_helpers.rb +0 -446
  105. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/format_helpers.rb +0 -260
  106. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/cz.yml +0 -103
  107. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/da.yml +0 -91
  108. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/de.yml +0 -78
  109. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/en.yml +0 -103
  110. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/es.yml +0 -103
  111. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/fr.yml +0 -79
  112. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/hu.yml +0 -103
  113. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/it.yml +0 -85
  114. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/ja.yml +0 -103
  115. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/nl.yml +0 -78
  116. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/no.yml +0 -91
  117. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/pl.yml +0 -95
  118. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/pt_br.yml +0 -103
  119. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/ru.yml +0 -103
  120. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/tr.yml +0 -103
  121. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/uk.yml +0 -103
  122. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/zh_cn.yml +0 -103
  123. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/zh_tw.yml +0 -103
  124. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/number_helpers.rb +0 -273
  125. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers.rb +0 -128
  126. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/abstract_handler.rb +0 -103
  127. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/erb_handler.rb +0 -79
  128. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/haml_handler.rb +0 -64
  129. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/slim_handler.rb +0 -82
  130. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/render_helpers.rb +0 -40
  131. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/tag_helpers.rb +0 -59
  132. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/translation_helpers.rb +0 -21
  133. data/lib/middleman/vendor/padrino-helpers-0.10.0/padrino-helpers.gemspec +0 -27
  134. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/app.rb +0 -73
  135. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/capture_concat.erb +0 -14
  136. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/capture_concat.haml +0 -12
  137. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/capture_concat.slim +0 -13
  138. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_for.erb +0 -11
  139. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_for.haml +0 -9
  140. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_for.slim +0 -9
  141. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_tag.erb +0 -11
  142. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_tag.haml +0 -9
  143. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_tag.slim +0 -9
  144. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/current_engine.erb +0 -5
  145. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/current_engine.haml +0 -5
  146. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/current_engine.slim +0 -5
  147. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/fields_for.erb +0 -20
  148. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/fields_for.haml +0 -15
  149. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/fields_for.slim +0 -15
  150. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_for.erb +0 -56
  151. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_for.haml +0 -47
  152. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_for.slim +0 -47
  153. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_tag.erb +0 -56
  154. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_tag.haml +0 -45
  155. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_tag.slim +0 -45
  156. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/link_to.erb +0 -5
  157. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/link_to.haml +0 -4
  158. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/link_to.slim +0 -4
  159. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/mail_to.erb +0 -3
  160. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/mail_to.haml +0 -3
  161. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/mail_to.slim +0 -3
  162. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/meta_tag.erb +0 -3
  163. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/meta_tag.haml +0 -3
  164. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/meta_tag.slim +0 -3
  165. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/partials/_erb.erb +0 -1
  166. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/partials/_haml.haml +0 -1
  167. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/partials/_slim.slim +0 -1
  168. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/simple_partial.erb +0 -1
  169. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/simple_partial.haml +0 -1
  170. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/simple_partial.slim +0 -1
  171. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/app.rb +0 -45
  172. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engine.haml +0 -5
  173. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engines/_erb.erb +0 -1
  174. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engines/_haml.haml +0 -1
  175. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engines/_slim.slim +0 -1
  176. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/erb/test.erb +0 -1
  177. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/explicit_engine.haml +0 -5
  178. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/haml/test.haml +0 -1
  179. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/template/_user.haml +0 -7
  180. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/template/haml_template.haml +0 -1
  181. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/template/some_template.haml +0 -2
  182. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/helper.rb +0 -78
  183. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_asset_tag_helpers.rb +0 -320
  184. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_form_builder.rb +0 -998
  185. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_form_helpers.rb +0 -645
  186. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_format_helpers.rb +0 -227
  187. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_number_helpers.rb +0 -136
  188. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_output_helpers.rb +0 -133
  189. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_render_helpers.rb +0 -69
  190. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_tag_helpers.rb +0 -100
@@ -1,220 +0,0 @@
1
- module Padrino
2
- module Helpers
3
- module FormBuilder #:nodoc:
4
- class AbstractFormBuilder #:nodoc:
5
- attr_accessor :template, :object
6
-
7
- def initialize(template, object, options={})
8
- @template = template
9
- @object = build_object(object)
10
- @options = options
11
- raise "FormBuilder template must be initialized!" unless template
12
- raise "FormBuilder object must be not be nil value. If there's no object, use a symbol instead! (i.e :user)" unless object
13
- end
14
-
15
- # f.error_messages
16
- def error_messages(*params)
17
- params.unshift object
18
- @template.error_messages_for(*params)
19
- end
20
-
21
- # f.error_message_on(field)
22
- def error_message_on(field, options={})
23
- @template.error_message_on(object, field, options)
24
- end
25
-
26
- # f.label :username, :caption => "Nickname"
27
- def label(field, options={})
28
- options.reverse_merge!(:caption => "#{field_human_name(field)}: ")
29
- @template.label_tag(field_id(field), options)
30
- end
31
-
32
- # f.hidden_field :session_id, :value => "45"
33
- def hidden_field(field, options={})
34
- options.reverse_merge!(:value => field_value(field), :id => field_id(field))
35
- @template.hidden_field_tag field_name(field), options
36
- end
37
-
38
- # f.text_field :username, :value => "(blank)", :id => 'username'
39
- def text_field(field, options={})
40
- options.reverse_merge!(:value => field_value(field), :id => field_id(field))
41
- options.merge!(:class => field_error(field, options))
42
- @template.text_field_tag field_name(field), options
43
- end
44
-
45
- # f.text_area :summary, :value => "(enter summary)", :id => 'summary'
46
- def text_area(field, options={})
47
- options.reverse_merge!(:value => field_value(field), :id => field_id(field))
48
- options.merge!(:class => field_error(field, options))
49
- @template.text_area_tag field_name(field), options
50
- end
51
-
52
- # f.password_field :password, :id => 'password'
53
- def password_field(field, options={})
54
- options.reverse_merge!(:value => field_value(field), :id => field_id(field))
55
- options.merge!(:class => field_error(field, options))
56
- @template.password_field_tag field_name(field), options
57
- end
58
-
59
- # f.select :color, :options => ['red', 'green'], :include_blank => true
60
- # f.select :color, :collection => @colors, :fields => [:name, :id]
61
- def select(field, options={})
62
- options.reverse_merge!(:id => field_id(field), :selected => field_value(field))
63
- options.merge!(:class => field_error(field, options))
64
- @template.select_tag field_name(field), options
65
- end
66
-
67
- # f.check_box :remember_me, :value => 'true', :uncheck_value => '0'
68
- def check_box(field, options={})
69
- unchecked_value = options.delete(:uncheck_value) || '0'
70
- options.reverse_merge!(:id => field_id(field), :value => '1')
71
- options.reverse_merge!(:checked => true) if values_matches_field?(field, options[:value])
72
- html = @template.hidden_field_tag(options[:name] || field_name(field), :value => unchecked_value, :id => nil)
73
- html << @template.check_box_tag(field_name(field), options)
74
- end
75
-
76
- # f.radio_button :gender, :value => 'male'
77
- def radio_button(field, options={})
78
- options.reverse_merge!(:id => field_id(field, options[:value]))
79
- options.reverse_merge!(:checked => true) if values_matches_field?(field, options[:value])
80
- @template.radio_button_tag field_name(field), options
81
- end
82
-
83
- # f.file_field :photo, :class => 'avatar'
84
- def file_field(field, options={})
85
- options.reverse_merge!(:id => field_id(field))
86
- options.merge!(:class => field_error(field, options))
87
- @template.file_field_tag field_name(field), options
88
- end
89
-
90
- # f.submit "Update", :class => 'large'
91
- def submit(caption="Submit", options={})
92
- @template.submit_tag caption, options
93
- end
94
-
95
- # f.image_submit "buttons/submit.png", :class => 'large'
96
- def image_submit(source, options={})
97
- @template.image_submit_tag source, options
98
- end
99
-
100
- # Supports nested fields for a child model within a form
101
- # f.fields_for :addresses
102
- # f.fields_for :addresses, address
103
- # f.fields_for :addresses, @addresses
104
- def fields_for(child_association, instance_or_collection=nil, &block)
105
- default_collection = self.object.send(child_association)
106
- include_index = default_collection.respond_to?(:each)
107
- nested_options = { :parent => self, :association => child_association }
108
- nested_objects = instance_or_collection ? Array(instance_or_collection) : Array(default_collection)
109
- result = nested_objects.each_with_index.map do |child_instance, index|
110
- nested_options[:index] = include_index ? index : nil
111
- @template.fields_for(child_instance, { :nested => nested_options }, &block)
112
- end.join("\n")
113
- end
114
-
115
- protected
116
- # Returns the known field types for a formbuilder
117
- def self.field_types
118
- [:hidden_field, :text_field, :text_area, :password_field, :file_field, :radio_button, :check_box, :select]
119
- end
120
-
121
- # Returns true if the value matches the value in the field
122
- # field_has_value?(:gender, 'male')
123
- def values_matches_field?(field, value)
124
- value.present? && (field_value(field).to_s == value.to_s || field_value(field).to_s == 'true')
125
- end
126
-
127
- # Add a :invalid css class to the field if it contain an error
128
- def field_error(field, options)
129
- error = @object.errors[field] rescue nil
130
- error.blank? ? options[:class] : [options[:class], :invalid].flatten.compact.join(" ")
131
- end
132
-
133
- # Returns the human name of the field. Look that use builtin I18n.
134
- def field_human_name(field)
135
- I18n.translate("#{object_model_name}.attributes.#{field}", :count => 1, :default => field.to_s.humanize, :scope => :models)
136
- end
137
-
138
- # Returns the name for the given field
139
- # field_name(:username) => "user[username]"
140
- # field_name(:number) => "user[telephone_attributes][number]"
141
- # field_name(:street) => "user[addresses_attributes][0][street]"
142
- def field_name(field=nil)
143
- result = []
144
- if root_form?
145
- result << object_model_name
146
- elsif nested_form?
147
- parent_form = @options[:nested][:parent]
148
- attributes_name = "#{@options[:nested][:association]}_attributes"
149
- nested_index = @options[:nested][:index]
150
- fragment = [parent_form.field_name, "[#{attributes_name}", "]"]
151
- fragment.insert(2, "][#{nested_index}") if nested_index
152
- result << fragment
153
- end
154
- result << "[#{field}]" unless field.blank?
155
- result.flatten.join
156
- end
157
-
158
- # Returns the id for the given field
159
- # field_id(:username) => "user_username"
160
- # field_id(:gender, :male) => "user_gender_male"
161
- # field_name(:number) => "user_telephone_attributes_number"
162
- # field_name(:street) => "user_addresses_attributes_0_street"
163
- def field_id(field=nil, value=nil)
164
- result = []
165
- if root_form?
166
- result << object_model_name
167
- elsif nested_form?
168
- parent_form = @options[:nested][:parent]
169
- attributes_name = "#{@options[:nested][:association]}_attributes"
170
- nested_index = @options[:nested][:index]
171
- fragment = [parent_form.field_id, "_#{attributes_name}"]
172
- fragment.push("_#{nested_index}") if nested_index
173
- result << fragment
174
- end
175
- result << "_#{field}" unless field.blank?
176
- result << "_#{value}" unless value.blank?
177
- result.flatten.join
178
- end
179
-
180
- # Returns the child object if it exists
181
- def nested_object_id
182
- nested_form? && object.respond_to?(:new_record?) && !object.new_record? && object.id
183
- end
184
-
185
- # Returns true if this form object is nested in a parent form
186
- def nested_form?
187
- @options[:nested] && @options[:nested][:parent] && @options[:nested][:parent].respond_to?(:object)
188
- end
189
-
190
- # Returns the value for the object's field
191
- # field_value(:username) => "Joey"
192
- def field_value(field)
193
- @object && @object.respond_to?(field) ? @object.send(field) : ""
194
- end
195
-
196
- # explicit_object is either a symbol or a record
197
- # Returns a new record of the type specified in the object
198
- def build_object(object_or_symbol)
199
- object_or_symbol.is_a?(Symbol) ? @template.instance_variable_get("@#{object_or_symbol}") || object_class(object_or_symbol).new : object_or_symbol
200
- end
201
-
202
- # Returns the object's models name
203
- # => user_assignment
204
- def object_model_name(explicit_object=object)
205
- explicit_object.is_a?(Symbol) ? explicit_object : explicit_object.class.to_s.underscore.gsub(/\//, '_')
206
- end
207
-
208
- # Returns the class type for the given object
209
- def object_class(explicit_object)
210
- explicit_object.is_a?(Symbol) ? explicit_object.to_s.camelize.constantize : explicit_object.class
211
- end
212
-
213
- # Returns true if this form is the top-level (not nested)
214
- def root_form?
215
- !nested_form?
216
- end
217
- end # AbstractFormBuilder
218
- end # FormBuilder
219
- end # Helpers
220
- end # Padrino
@@ -1,43 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/abstract_form_builder') unless defined?(AbstractFormBuilder)
2
-
3
- module Padrino
4
- module Helpers
5
- module FormBuilder #:nodoc:
6
- class StandardFormBuilder < AbstractFormBuilder #:nodoc:
7
-
8
- ##
9
- # StandardFormBuilder
10
- #
11
- # text_field_block(:username, { :class => 'long' }, { :class => 'wide-label' })
12
- # text_area_block(:summary, { :class => 'long' }, { :class => 'wide-label' })
13
- # password_field_block(:password, { :class => 'long' }, { :class => 'wide-label' })
14
- # file_field_block(:photo, { :class => 'long' }, { :class => 'wide-label' })
15
- # check_box_block(:remember_me, { :class => 'long' }, { :class => 'wide-label' })
16
- # select_block(:color, :options => ['green', 'black'])
17
- #
18
- (self.field_types - [ :hidden_field, :radio_button ]).each do |field_type|
19
- class_eval <<-EOF
20
- def #{field_type}_block(field, options={}, label_options={})
21
- label_options.reverse_merge!(:caption => options.delete(:caption)) if options[:caption]
22
- field_html = label(field, label_options)
23
- field_html << #{field_type}(field, options)
24
- @template.content_tag(:p, field_html)
25
- end
26
- EOF
27
- end
28
-
29
- # submit_block("Update")
30
- def submit_block(caption, options={})
31
- submit_html = self.submit(caption, options)
32
- @template.content_tag(:p, submit_html)
33
- end
34
-
35
- # image_submit_block("submit.png")
36
- def image_submit_block(source, options={})
37
- submit_html = self.image_submit(source, options)
38
- @template.content_tag(:p, submit_html)
39
- end
40
- end # StandardFormBuilder
41
- end # FormBuilder
42
- end # Helpers
43
- end # Padrino
@@ -1,446 +0,0 @@
1
- module Padrino
2
- module Helpers
3
- module FormHelpers
4
- ##
5
- # Constructs a form for object using given or default form_builder
6
- #
7
- # ==== Examples
8
- #
9
- # form_for :user, '/register' do |f| ... end
10
- # form_for @user, '/register', :id => 'register' do |f| ... end
11
- #
12
- def form_for(object, url, settings={}, &block)
13
- form_html = capture_html(builder_instance(object, settings), &block)
14
- form_tag(url, settings) { form_html }
15
- end
16
-
17
- ##
18
- # Constructs form fields for an object using given or default form_builder
19
- # Used within an existing form to allow alternate objects within one form
20
- #
21
- # ==== Examples
22
- #
23
- # fields_for @user.assignment do |assignment| ... end
24
- # fields_for :assignment do |assigment| ... end
25
- #
26
- def fields_for(object, settings={}, &block)
27
- instance = builder_instance(object, settings)
28
- fields_html = capture_html(instance, &block)
29
- fields_html << instance.hidden_field(:id) if instance.send(:nested_object_id)
30
- concat_content fields_html
31
- end
32
-
33
- ##
34
- # Constructs a form without object based on options
35
- #
36
- # ==== Examples
37
- #
38
- # form_tag '/register' do ... end
39
- #
40
- def form_tag(url, options={}, &block)
41
- desired_method = options[:method]
42
- data_method = options.delete(:method) if options[:method].to_s !~ /get|post/i
43
- options.reverse_merge!(:method => "post", :action => url)
44
- options[:enctype] = "multipart/form-data" if options.delete(:multipart)
45
- options["data-remote"] = "true" if options.delete(:remote)
46
- options["data-method"] = data_method if data_method
47
- options["accept-charset"] ||= "UTF-8"
48
- inner_form_html = hidden_form_method_field(desired_method)
49
- inner_form_html += capture_html(&block)
50
- concat_content content_tag(:form, inner_form_html, options)
51
- end
52
-
53
- ##
54
- # Returns the hidden method field for 'put' and 'delete' forms
55
- # Only 'get' and 'post' are allowed within browsers;
56
- # 'put' and 'delete' are just specified using hidden fields with form action still 'put'.
57
- #
58
- # ==== Examples
59
- #
60
- # # Generate: <input name="_method" value="delete" />
61
- # hidden_form_method_field('delete')
62
- #
63
- def hidden_form_method_field(desired_method)
64
- return '' if desired_method.blank? || desired_method.to_s =~ /get|post/i
65
- hidden_field_tag(:_method, :value => desired_method)
66
- end
67
-
68
- ##
69
- # Constructs a field_set to group fields with given options
70
- #
71
- # ==== Examples
72
- #
73
- # field_set_tag("Office", :class => 'office-set')
74
- #
75
- def field_set_tag(*args, &block)
76
- options = args.extract_options!
77
- legend_text = args[0].is_a?(String) ? args.first : nil
78
- legend_html = legend_text.blank? ? '' : content_tag(:legend, legend_text)
79
- field_set_content = legend_html + capture_html(&block)
80
- concat_content content_tag(:fieldset, field_set_content, options)
81
- end
82
-
83
- ##
84
- # Constructs list html for the errors for a given symbol
85
- #
86
- # ==== Options
87
- #
88
- # :header_tag:: Used for the header of the error div (default: "h2").
89
- # :id:: The id of the error div (default: "errorExplanation").
90
- # :class:: The class of the error div (default: "errorExplanation").
91
- # :object:: The object (or array of objects) for which to display errors,
92
- # if you need to escape the instance variable convention.
93
- # :object_name:: The object name to use in the header, or any text that you prefer.
94
- # If +:object_name+ is not set, the name of the first object will be used.
95
- # :header_message:: The message in the header of the error div. Pass +nil+
96
- # or an empty string to avoid the header message altogether. (Default: "X errors
97
- # prohibited this object from being saved").
98
- # :message:: The explanation message after the header message and before
99
- # the error list. Pass +nil+ or an empty string to avoid the explanation message
100
- # altogether. (Default: "There were problems with the following fields:").
101
- #
102
- # ==== Examples
103
- #
104
- # error_messages_for :user
105
- #
106
- def error_messages_for(*objects)
107
- options = objects.extract_options!.symbolize_keys
108
- objects = objects.map {|object_name| object_name.is_a?(Symbol) ? instance_variable_get("@#{object_name}") : object_name }.compact
109
- count = objects.inject(0) {|sum, object| sum + object.errors.size }
110
-
111
- unless count.zero?
112
- html = {}
113
- [:id, :class, :style].each do |key|
114
- if options.include?(key)
115
- value = options[key]
116
- html[key] = value unless value.blank?
117
- else
118
- html[key] = 'field-errors' unless key == :style
119
- end
120
- end
121
-
122
- options[:object_name] ||= objects.first.class
123
-
124
- I18n.with_options :locale => options[:locale], :scope => [:models, :errors, :template] do |locale|
125
- header_message = if options.include?(:header_message)
126
- options[:header_message]
127
- else
128
- object_name = options[:object_name].to_s.underscore.gsub(/\//, ' ')
129
- object_name = I18n.t(:name, :default => object_name.humanize, :scope => [:models, object_name], :count => 1)
130
- locale.t :header, :count => count, :model => object_name
131
- end
132
- message = options.include?(:message) ? options[:message] : locale.t(:body)
133
- error_messages = objects.map { |object|
134
- object_name = options[:object_name].to_s.underscore.gsub(/\//, ' ')
135
- object.errors.map { |f, msg|
136
- field = I18n.t(f, :default => f.to_s.humanize, :scope => [:models, object_name, :attributes])
137
- content_tag(:li, "%s %s" % [field, msg])
138
- }
139
- }.join
140
-
141
- contents = ''
142
- contents << content_tag(options[:header_tag] || :h2, header_message) unless header_message.blank?
143
- contents << content_tag(:p, message) unless message.blank?
144
- contents << content_tag(:ul, error_messages)
145
-
146
- content_tag(:div, contents, html)
147
- end
148
- else
149
- ''
150
- end
151
- end
152
-
153
- ##
154
- # Returns a string containing the error message attached to the +method+ on the +object+ if one exists.
155
- #
156
- # ==== Options
157
- #
158
- # :tag:: The tag that enclose your error. (Default 'div')
159
- # :prepend:: Text to add before error.
160
- # :append:: Text to add after error.
161
- #
162
- # ==== Examples
163
- #
164
- # # => <span class="error">can't be blank</div>
165
- # error_message_on :post, :title
166
- # error_message_on @post, :title
167
- #
168
- # # => <div class="custom" style="border:1px solid red">can't be blank</div>
169
- # error_message_on :post, :title, :tag => :id, :class => :custom, :style => "border:1px solid red"
170
- #
171
- # # => <div class="error">This title can't be blank (or it won't work)</div>
172
- # error_message_on :post, :title, :prepend => "This title", :append => "(or it won't work)"
173
- #
174
- def error_message_on(object, field, options={})
175
- object = object.is_a?(Symbol) ? instance_variable_get("@#{object}") : object
176
- error = object.errors[field] rescue nil
177
- if error
178
- options.reverse_merge!(:tag => :span, :class => :error)
179
- tag = options.delete(:tag)
180
- # Array(error).first is necessary because some orm give us an array others directly a value
181
- error = [options.delete(:prepend), Array(error).first, options.delete(:append)].compact.join(" ")
182
- content_tag(tag, error, options)
183
- else
184
- ''
185
- end
186
- end
187
-
188
- ##
189
- # Constructs a label tag from the given options
190
- #
191
- # ==== Examples
192
- #
193
- # label_tag :username, :class => 'long-label'
194
- # label_tag :username, :class => 'long-label' do ... end
195
- #
196
- def label_tag(name, options={}, &block)
197
- options.reverse_merge!(:caption => "#{name.to_s.humanize}: ", :for => name)
198
- caption_text = options.delete(:caption)
199
- caption_text << "<span class='required'>*</span> " if options.delete(:required)
200
- if block_given? # label with inner content
201
- label_content = caption_text + capture_html(&block)
202
- concat_content(content_tag(:label, label_content, options))
203
- else # regular label
204
- content_tag(:label, caption_text, options)
205
- end
206
- end
207
-
208
- ##
209
- # Constructs a hidden field input from the given options
210
- #
211
- # ==== Examples
212
- #
213
- # hidden_field_tag :session_key, :value => "__secret__"
214
- #
215
- def hidden_field_tag(name, options={})
216
- options.reverse_merge!(:name => name)
217
- input_tag(:hidden, options)
218
- end
219
-
220
- ##
221
- # Constructs a text field input from the given options
222
- #
223
- # ==== Examples
224
- #
225
- # text_field_tag :username, :class => 'long'
226
- #
227
- def text_field_tag(name, options={})
228
- options.reverse_merge!(:name => name)
229
- input_tag(:text, options)
230
- end
231
-
232
- ##
233
- # Constructs a text area input from the given options
234
- #
235
- # ==== Examples
236
- #
237
- # text_area_tag :username, :class => 'long', :value => "Demo?"
238
- #
239
- def text_area_tag(name, options={})
240
- options.reverse_merge!(:name => name, :rows => "", :cols => "")
241
- content_tag(:textarea, options.delete(:value).to_s, options)
242
- end
243
-
244
- ##
245
- # Constructs a password field input from the given options
246
- #
247
- # ==== Examples
248
- #
249
- # password_field_tag :password, :class => 'long'
250
- #
251
- def password_field_tag(name, options={})
252
- options.reverse_merge!(:name => name)
253
- input_tag(:password, options)
254
- end
255
-
256
- ##
257
- # Constructs a select from the given options
258
- #
259
- # ==== Examples
260
- #
261
- # options = [['caption', 'value'], ['Green', 'green1'], ['Blue', 'blue1'], ['Black', "black1"]]
262
- # options = ['option', 'red', 'yellow' ]
263
- # select_tag(:favorite_color, :options => ['red', 'yellow'], :selected => 'green1')
264
- # select_tag(:country, :collection => @countries, :fields => [:name, :code], :include_blank => 'None')
265
- #
266
- # # Optgroups can be generated using :grouped_options => (Hash or nested Array)
267
- # grouped_options = [['Friends',['Yoda',['Obiwan',1]]],['Enemies',['Palpatine',['Darth Vader',3]]]]
268
- # grouped_options = {'Friends' => ['Yoda',['Obiwan',1]],'Enemies' => ['Palpatine',['Darth Vader',3]]}
269
- # select_tag(:color, :grouped_options => [['warm',['red','yellow']],['cool',['blue', 'purple']]])
270
- #
271
- # # Optgroups can be generated using :grouped_options => (Hash or nested Array)
272
- # grouped_options = [['Friends',['Yoda',['Obiwan',1]]],['Enemies',['Palpatine',['Darth Vader',3]]]]
273
- # grouped_options = {'Friends' => ['Yoda',['Obiwan',1]],'Enemies' => ['Palpatine',['Darth Vader',3]]}
274
- # select_tag(:color, :grouped_options => [['warm',['red','yellow']],['cool',['blue', 'purple']]])
275
- #
276
- def select_tag(name, options={})
277
- options.reverse_merge!(:name => name)
278
- collection, fields = options.delete(:collection), options.delete(:fields)
279
- options[:options] = options_from_collection(collection, fields) if collection
280
- prompt = options.delete(:include_blank)
281
- select_options_html = if options[:options]
282
- options_for_select(options.delete(:options), options.delete(:selected))
283
- elsif options[:grouped_options]
284
- grouped_options_for_select(options.delete(:grouped_options), options.delete(:selected), prompt)
285
- end
286
- select_options_html = select_options_html.unshift(blank_option(prompt)) if select_options_html.is_a?(Array)
287
- options.merge!(:name => "#{options[:name]}[]") if options[:multiple]
288
- content_tag(:select, select_options_html, options)
289
- end
290
-
291
- ##
292
- # Constructs a check_box from the given options
293
- #
294
- # ==== Examples
295
- #
296
- # check_box_tag :remember_me, :value => 'Yes'
297
- #
298
- def check_box_tag(name, options={})
299
- options.reverse_merge!(:name => name, :value => '1')
300
- input_tag(:checkbox, options)
301
- end
302
-
303
- ##
304
- # Constructs a radio_button from the given options
305
- #
306
- # ==== Examples
307
- #
308
- # radio_button_tag :remember_me, :value => 'true'
309
- #
310
- def radio_button_tag(name, options={})
311
- options.reverse_merge!(:name => name)
312
- input_tag(:radio, options)
313
- end
314
-
315
- ##
316
- # Constructs a file field input from the given options
317
- #
318
- # ==== Examples
319
- #
320
- # file_field_tag :photo, :class => 'long'
321
- #
322
- def file_field_tag(name, options={})
323
- options.reverse_merge!(:name => name)
324
- input_tag(:file, options)
325
- end
326
-
327
- ##
328
- # Constructs a submit button from the given options
329
- #
330
- # ==== Examples
331
- #
332
- # submit_tag "Create", :class => 'success'
333
- #
334
- def submit_tag(caption="Submit", options={})
335
- options.reverse_merge!(:value => caption)
336
- input_tag(:submit, options)
337
- end
338
-
339
- ##
340
- # Constructs a button input from the given options
341
- #
342
- # ==== Examples
343
- #
344
- # button_tag "Cancel", :class => 'clear'
345
- #
346
- def button_tag(caption, options = {})
347
- options.reverse_merge!(:value => caption)
348
- input_tag(:button, options)
349
- end
350
-
351
- # Constructs a submit button from the given options
352
- #
353
- # ==== Examples
354
- #
355
- # submit_tag "Create", :class => 'success'
356
- #
357
- def image_submit_tag(source, options={})
358
- options.reverse_merge!(:src => image_path(source))
359
- input_tag(:image, options)
360
- end
361
-
362
- ##
363
- # Returns an array of option items for a select field based on the given collection
364
- # fields is an array containing the fields to display from each item in the collection
365
- #
366
- def options_from_collection(collection, fields)
367
- collection.map { |item| [ item.send(fields.first), item.send(fields.last) ] }
368
- end
369
-
370
- #
371
- # Returns the options tags for a select based on the given option items
372
- #
373
- def options_for_select(option_items, selected_value=nil)
374
- return '' if option_items.blank?
375
- option_items.map do |caption, value|
376
- value ||= caption
377
- content_tag(:option, caption, :value => value, :selected => option_is_selected?(value, caption, selected_value))
378
- end
379
- end
380
-
381
- #
382
- # Returns the optgroups with options tags for a select based on the given :grouped_options items
383
- #
384
- def grouped_options_for_select(collection,selected=nil,prompt=false)
385
- if collection.is_a?(Hash)
386
- collection.map do |key, value|
387
- content_tag :optgroup, :label => key do
388
- options_for_select(value, selected)
389
- end
390
- end
391
- elsif collection.is_a?(Array)
392
- collection.map do |optgroup|
393
- content_tag :optgroup, :label => optgroup.first do
394
- options_for_select(optgroup.last, selected)
395
- end
396
- end
397
- end
398
- end
399
-
400
- #
401
- # Returns the blank option serving as a prompt if passed
402
- #
403
- def blank_option(prompt)
404
- return unless prompt
405
- case prompt
406
- when String then content_tag(:option, prompt, :value => '')
407
- when Array then content_tag(:option, prompt.first, :value => prompt.last)
408
- else content_tag(:option, '', :value => '')
409
- end
410
- end
411
-
412
- private
413
- ##
414
- # Returns the FormBuilder class to use based on all available setting sources
415
- # If explicitly defined, returns that, otherwise returns defaults.
416
- #
417
- # configured_form_builder_class(nil) => StandardFormBuilder
418
- #
419
- def configured_form_builder_class(explicit_builder=nil)
420
- default_builder = self.respond_to?(:settings) && self.settings.default_builder
421
- configured_builder = explicit_builder || default_builder || 'StandardFormBuilder'
422
- configured_builder = "Padrino::Helpers::FormBuilder::#{configured_builder}".constantize if configured_builder.is_a?(String)
423
- configured_builder
424
- end
425
-
426
- ##
427
- # Returns an initialized builder instance for the given object and settings
428
- #
429
- # builder_instance(@account, :nested => { ... }) => <FormBuilder>
430
- #
431
- def builder_instance(object, settings={})
432
- builder_class = configured_form_builder_class(settings.delete(:builder))
433
- builder_class.new(self, object, settings)
434
- end
435
-
436
- ##
437
- # Returns whether the option should be selected or not
438
- #
439
- def option_is_selected?(value, caption, selected_values)
440
- Array(selected_values).any? do |selected|
441
- [value.to_s, caption.to_s].include?(selected.to_s)
442
- end
443
- end
444
- end # FormHelpers
445
- end # Helpers
446
- end # Padrino