class SimpleForm::Inputs::CollectionInput

Constants

BASIC_OBJECT_CLASSES

Public Class Methods

boolean_collection() click to toggle source

Default boolean collection for use with selects/radios when no collection is given. Always fallback to this boolean collection. Texts can be translated using i18n in “simple_form.yes” and “simple_form.no” keys. See the example locale file.

# File lib/simple_form/inputs/collection_input.rb, line 12
def self.boolean_collection
  i18n_cache :boolean_collection do
    [ [I18n.t(:"simple_form.yes", default: 'Yes'), true],
      [I18n.t(:"simple_form.no", default: 'No'), false] ]
  end
end

Public Instance Methods

input(wrapper_options = nil) click to toggle source
# File lib/simple_form/inputs/collection_input.rb, line 19
def input(wrapper_options = nil)
  raise NotImplementedError,
    "input should be implemented by classes inheriting from CollectionInput"
end
input_options() click to toggle source
Calls superclass method SimpleForm::Inputs::Base#input_options
# File lib/simple_form/inputs/collection_input.rb, line 24
def input_options
  options = super

  options[:include_blank] = true unless skip_include_blank?
  translate_option options, :prompt
  translate_option options, :include_blank

  options
end

Private Instance Methods

collection() click to toggle source
# File lib/simple_form/inputs/collection_input.rb, line 36
def collection
  @collection ||= begin
    collection = options.delete(:collection) || self.class.boolean_collection
    collection.respond_to?(:call) ? collection.call : collection.to_a
  end
end
collection_includes_basic_objects?(collection_classes) click to toggle source
# File lib/simple_form/inputs/collection_input.rb, line 96
def collection_includes_basic_objects?(collection_classes)
  (collection_classes & BASIC_OBJECT_CLASSES).any?
end
detect_collection_classes(some_collection = collection) click to toggle source
# File lib/simple_form/inputs/collection_input.rb, line 92
def detect_collection_classes(some_collection = collection)
  some_collection.map(&:class).uniq
end
detect_collection_methods() click to toggle source

Detect the right method to find the label and value for a collection. If no label or value method are defined, will attempt to find them based on default label and value methods that can be configured through SimpleForm.collection_label_methods and SimpleForm.collection_value_methods.

# File lib/simple_form/inputs/collection_input.rb, line 61
def detect_collection_methods
  label, value = options.delete(:label_method), options.delete(:value_method)

  unless label && value
    common_method_for = detect_common_display_methods
    label ||= common_method_for[:label]
    value ||= common_method_for[:value]
  end

  [label, value]
end
detect_common_display_methods(collection_classes = detect_collection_classes) click to toggle source
# File lib/simple_form/inputs/collection_input.rb, line 73
def detect_common_display_methods(collection_classes = detect_collection_classes)
  collection_translated = translate_collection if collection_classes == [Symbol]

  if collection_translated || collection_classes.include?(Array)
    { label: :first, value: :second }
  elsif collection_includes_basic_objects?(collection_classes)
    { label: :to_s, value: :to_s }
  else
    detect_method_from_class(collection_classes)
  end
end
detect_method_from_class(collection_classes) click to toggle source
# File lib/simple_form/inputs/collection_input.rb, line 85
def detect_method_from_class(collection_classes)
  sample = collection.first || collection.last

  { label: SimpleForm.collection_label_methods.find { |m| sample.respond_to?(m) },
    value: SimpleForm.collection_value_methods.find { |m| sample.respond_to?(m) } }
end
has_required?() click to toggle source
# File lib/simple_form/inputs/collection_input.rb, line 43
def has_required?
  super && (input_options[:include_blank] || input_options[:prompt] || multiple?)
end
multiple?() click to toggle source
# File lib/simple_form/inputs/collection_input.rb, line 52
def multiple?
  !!options[:input_html].try(:[], :multiple)
end
skip_include_blank?() click to toggle source

Check if :include_blank must be included by default.

# File lib/simple_form/inputs/collection_input.rb, line 48
def skip_include_blank?
  (options.keys & %i[prompt include_blank default selected]).any? || multiple?
end
translate_collection() click to toggle source
# File lib/simple_form/inputs/collection_input.rb, line 100
def translate_collection
  if translated_collection = translate_from_namespace(:options)
    @collection = collection.map do |key|
      html_key = "#{key}_html".to_sym

      if translated_collection[html_key]
        [translated_collection[html_key].html_safe || key, key.to_s]
      else
        [translated_collection[key] || key, key.to_s]
      end
    end
    true
  end
end
translate_option(options, key) click to toggle source
# File lib/simple_form/inputs/collection_input.rb, line 115
def translate_option(options, key)
  if options[key] == :translate
    namespace = key.to_s.pluralize

    options[key] = translate_from_namespace(namespace, true)
  end
end