Module: SimpleFormWithClientValidation::ActionViewExtensions::Builder

Included in:
ActionView::Helpers::FormBuilder
Defined in:
lib/simple_form_with_client_validation/action_view_extensions/builder.rb

Overview

A collection of methods required by simple_form but added to rails default form. This means that you can use such methods outside simple_form context.

Instance Method Summary collapse

Instance Method Details

#collection_check_boxes(attribute, collection, value_method, text_method, options = {}, html_options = {}) ⇒ Object

Creates a collection of check boxes for each item in the collection, associated with a clickable label. Use value_method and text_method to convert items in the collection for use as text/value in check boxes. You can give a symbol or a proc to both value_method and text_method, that will be evaluated for each item in the collection.

Examples

form_for @user do |f|
  f.collection_check_boxes :options, [[true, 'Yes'] ,[false, 'No']], :first, :last
end

<input name="user[options][]" type="hidden" value="" />
<input id="user_options_true" name="user[options][]" type="checkbox" value="true" />
<label class="collection_check_boxes" for="user_options_true">Yes</label>
<input name="user[options][]" type="hidden" value="" />
<input id="user_options_false" name="user[options][]" type="checkbox" value="false" />
<label class="collection_check_boxes" for="user_options_false">No</label>

It is also possible to give a block that should generate the check box + label. To wrap the check box with the label, for instance:

form_for @user do |f|
  f.collection_check_boxes(
    :options, [[true, 'Yes'] ,[false, 'No']], :first, :last
  ) do |b|
    b.label { b.check_box + b.text }
  end
end

Options

Collection check box accepts some extra options:

* checked  => the value or values that should be checked initially. Accepts
              a single item or an array of items. It overrides existing associations.

* disabled => the value or values that should be disabled. Accepts a single
              item or an array of items.

* collection_wrapper_tag   => the tag to wrap the entire collection.

* collection_wrapper_class => the CSS class to use for collection_wrapper_tag

* item_wrapper_tag         => the tag to wrap each item in the collection.

* item_wrapper_class       => the CSS class to use for item_wrapper_tag

* a block                  => to generate the label + check box or any other component.


157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/simple_form_with_client_validation/action_view_extensions/builder.rb', line 157

def collection_check_boxes(attribute, collection, value_method, text_method, options={}, html_options={})
  rendered_collection = render_collection(
    collection, value_method, text_method, options, html_options
  ) do |item, value, text, default_html_options|
    default_html_options[:multiple] = true
    builder = instantiate_builder(CheckBoxBuilder, attribute, item, value, text, default_html_options)

    if block_given?
      yield builder
    else
      builder.check_box + builder.label(:class => "collection_check_boxes")
    end
  end

  # Append a hidden field to make sure something will be sent back to the
  # server if all checkboxes are unchecked.
  hidden = template.hidden_field_tag("#{object_name}[#{attribute}][]", "", :id => nil)

  wrap_rendered_collection(rendered_collection + hidden, options)
end

#collection_radio_buttons(attribute, collection, value_method, text_method, options = {}, html_options = {}) ⇒ Object

Create a collection of radio inputs for the attribute. Basically this helper will create a radio input associated with a label for each text/value option in the collection, using value_method and text_method to convert these text/value. You can give a symbol or a proc to both value_method and text_method, that will be evaluated for each item in the collection.

Examples

form_for @user do |f|
  f.collection_radio_buttons :options, [[true, 'Yes'] ,[false, 'No']], :first, :last
end

<input id="user_options_true" name="user[options]" type="radio" value="true" />
<label class="collection_radio_buttons" for="user_options_true">Yes</label>
<input id="user_options_false" name="user[options]" type="radio" value="false" />
<label class="collection_radio_buttons" for="user_options_false">No</label>

It is also possible to give a block that should generate the radio + label. To wrap the radio with the label, for instance:

form_for @user do |f|
  f.collection_radio_buttons(
    :options, [[true, 'Yes'] ,[false, 'No']], :first, :last
  ) do |b|
    b.label { b.radio_button + b.text }
  end
end

Options

Collection radio accepts some extra options:

* checked  => the value that should be checked initially.

* disabled => the value or values that should be disabled. Accepts a single
              item or an array of items.

* collection_wrapper_tag   => the tag to wrap the entire collection.

* collection_wrapper_class => the CSS class to use for collection_wrapper_tag

* item_wrapper_tag         => the tag to wrap each item in the collection.

* item_wrapper_class       => the CSS class to use for item_wrapper_tag

* a block                  => to generate the label + radio or any other component.


91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/simple_form_with_client_validation/action_view_extensions/builder.rb', line 91

def collection_radio_buttons(attribute, collection, value_method, text_method, options={}, html_options={})
  rendered_collection = render_collection(
    collection, value_method, text_method, options, html_options
  ) do |item, value, text, default_html_options|
    builder = instantiate_builder(RadioButtonBuilder, attribute, item, value, text, default_html_options)

    if block_given?
      yield builder
    else
      builder.radio_button + builder.label(:class => "collection_radio_buttons")
    end
  end

  wrap_rendered_collection(rendered_collection, options)
end

#simple_fields_for(*args, &block) ⇒ Object

Wrapper for using SimpleFormWithClientValidation inside a default rails form. Example:

form_for @user do |f|
  f.simple_fields_for :posts do |posts_form|
    # Here you have all simple_form methods available
    posts_form.input :title
  end
end


187
188
189
190
191
192
193
194
195
196
197
# File 'lib/simple_form_with_client_validation/action_view_extensions/builder.rb', line 187

def simple_fields_for(*args, &block)
  options = args.extract_options!
  options[:wrapper] ||= self.options[:wrapper]

  if self.class < ActionView::Helpers::FormBuilder
    options[:builder] ||= self.class
  else
    options[:builder] ||= SimpleFormWithClientValidation::FormBuilder
  end
  fields_for(*(args << options), &block)
end