Module: ActiveForm::Mixins::CollectionElementMethods

Included in:
Element::CollectionOptionGroup
Defined in:
lib/active_form/mixins/collection_element_methods.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/active_form/mixins/collection_element_methods.rb', line 3

def self.included(base)
  base.send(:include, Enumerable)
  
  base.send(:alias_method, :values, :element_value)
  base.send(:alias_method, :value, :element_value)
      
  base.send(:alias_method, :selected=, :element_value=)
  base.send(:alias_method, :update_from_params, :element_value=)
  base.send(:alias_method, :params=, :element_value=)  
  base.send(:alias_method, :initial_value=, :element_value=) 
  base.send(:alias_method, :update_value, :element_value=) 
  base.send(:alias_method, :values=, :element_value=)
  base.send(:alias_method, :value=, :element_value=) 
  base.send(:alias_method, :binding=, :element_value=)
  base.send(:alias_method, :bind_to, :element_value=)  
end

Instance Method Details

#add_empty=(value) ⇒ Object



120
121
122
# File 'lib/active_form/mixins/collection_element_methods.rb', line 120

def add_empty=(value)
  add_empty_option if value
end

#add_empty_option(label = '--', value = :blank) ⇒ Object Also known as: add_empty



124
125
126
# File 'lib/active_form/mixins/collection_element_methods.rb', line 124

def add_empty_option(label = '--', value = :blank)
  self.options.unshift(ActiveForm::Element::CollectionOption.new(label, value))
end

#add_optgroup(*args, &block) ⇒ Object Also known as: option_group



129
130
131
# File 'lib/active_form/mixins/collection_element_methods.rb', line 129

def add_optgroup(*args, &block)
  self.options << ActiveForm::Element::CollectionOptionGroup.new(*args, &block)    
end

#add_option(value) ⇒ Object Also known as: <<



95
96
97
98
99
100
101
102
103
104
# File 'lib/active_form/mixins/collection_element_methods.rb', line 95

def add_option(value)
  if value.kind_of?(ActiveForm::Element::CollectionOption)
    self.options << value
  elsif (value.kind_of?(Array) || value.kind_of?(Set))
    self.options << ActiveForm::Element::CollectionOption.new(value.first, value.last)
  else
    self.options << ActiveForm::Element::CollectionOption.new(value, value)
  end
  self
end

#add_options(values) ⇒ Object Also known as: append



90
91
92
# File 'lib/active_form/mixins/collection_element_methods.rb', line 90

def add_options(values)
  values.each { |value| add_option(value) }
end

#blank?Boolean

Returns:

  • (Boolean)


148
149
150
# File 'lib/active_form/mixins/collection_element_methods.rb', line 148

def blank?
  element_value.blank? || !valid_value?
end

#default_valueObject



48
49
50
# File 'lib/active_form/mixins/collection_element_methods.rb', line 48

def default_value
  multiple? ? [] : super
end

#each(&block) ⇒ Object



20
21
22
# File 'lib/active_form/mixins/collection_element_methods.rb', line 20

def each(&block)
  options.each(&block)
end

#element_nameObject



34
35
36
37
38
# File 'lib/active_form/mixins/collection_element_methods.rb', line 34

def element_name
  elem_name = super
  elem_name << '[]' if multiple?
  elem_name
end

#element_valueObject



40
41
42
# File 'lib/active_form/mixins/collection_element_methods.rb', line 40

def element_value
  multiple? ? [*super].compact.flatten : [*super].compact.first
end

#element_value=(val) ⇒ Object



44
45
46
# File 'lib/active_form/mixins/collection_element_methods.rb', line 44

def element_value=(val)
  super(cast_value(multiple? ? [*val].compact.flatten : val.respond_to?(:compact) ? [*val].compact.first : val))
end

#empty_option=(label = '--') ⇒ Object Also known as: empty=



115
116
117
# File 'lib/active_form/mixins/collection_element_methods.rb', line 115

def empty_option=(label = '--')
  add_empty_option(label)
end

#fallback_value=(value) ⇒ Object



52
53
54
55
56
57
58
# File 'lib/active_form/mixins/collection_element_methods.rb', line 52

def fallback_value=(value)
  if multiple?   
    @fallback_value = value.respond_to?(:to_a) ? value.to_a : [value].flatten
  else
    @fallback_value = [*value].compact.first
  end
end

#option(label, value = nil) ⇒ Object



107
108
109
# File 'lib/active_form/mixins/collection_element_methods.rb', line 107

def option(label, value = nil)
  self << [label, (value || label)]
end

#option_labelsObject



60
61
62
63
64
# File 'lib/active_form/mixins/collection_element_methods.rb', line 60

def option_labels
  results = []
  self.recurse { |option| results << option.label }
  results
end

#option_valuesObject



66
67
68
69
70
# File 'lib/active_form/mixins/collection_element_methods.rb', line 66

def option_values
  results = []
  self.recurse { |option| results << option.value }
  results
end

#optionsObject



81
82
83
# File 'lib/active_form/mixins/collection_element_methods.rb', line 81

def options
  @options ||= []
end

#options=(values) ⇒ Object



85
86
87
88
# File 'lib/active_form/mixins/collection_element_methods.rb', line 85

def options=(values)
  reset_options!
  add_options(values)
end

#recurse(&block) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/active_form/mixins/collection_element_methods.rb', line 24

def recurse(&block)
  options.each do |option|
    if option.kind_of?(ActiveForm::Element::CollectionOptionGroup)
      option.options.each(&block)
    else
      block.call(option)     
    end
  end
end

#required=(value) ⇒ Object



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/active_form/mixins/collection_element_methods.rb', line 152

def required=(value)
  if value.kind_of?(Numeric)
    min_required = value.kind_of?(Numeric) ? value.to_i : 0 
    max_required = min_required
  elsif value.respond_to?(:first) && value.respond_to?(:last)
    min_required = value.first.to_i
    max_required = value.last.to_i
  else
    min_required = 0
    max_required = 0
  end
  validate_with_count = (min_required > 0 || (min_required == 0 && max_required > 0)) 
  self.option_flags[:required] = value.to_s.to_boolean || validate_with_count
  if self.option_flags[:required]
    if validate_with_count
      validates_with_option_count :code => 'required', :range => (min_required..max_required)
    else
      validates_as_required
    end
  else
    validators.delete_if { |v| v.code == 'required' }
  end
end

#reset_options!Object



111
112
113
# File 'lib/active_form/mixins/collection_element_methods.rb', line 111

def reset_options!
  @options = []
end

#select_first=(bool = true) ⇒ Object Also known as: select_first



134
135
136
# File 'lib/active_form/mixins/collection_element_methods.rb', line 134

def select_first=(bool = true)
  self.element_value = option_values.first if bool
end

#selected_option_labelObject



144
145
146
# File 'lib/active_form/mixins/collection_element_methods.rb', line 144

def selected_option_label
  self.options.inject([]) { |ary, opt| ary << opt.label if selected_value?(opt.value); ary }.join(', ')
end

#selected_value?(value) ⇒ Boolean Also known as: selected?

Returns:

  • (Boolean)


139
140
141
# File 'lib/active_form/mixins/collection_element_methods.rb', line 139

def selected_value?(value)
  multiple? ? (element_value || []).include?(value) : element_value == value
end

#valid_option?(value) ⇒ Boolean

Returns:

  • (Boolean)


72
73
74
# File 'lib/active_form/mixins/collection_element_methods.rb', line 72

def valid_option?(value)
  (option_values + [*fallback_value] + [*default_value]).compact.include?(value)
end

#valid_value?Boolean

Returns:

  • (Boolean)


76
77
78
79
# File 'lib/active_form/mixins/collection_element_methods.rb', line 76

def valid_value?
  raw_values = [*element_value]
  (raw_values & option_values).length == raw_values.length
end