Module: ActiveForm::Mixins::ValidationMethods

Defined in:
lib/active_form/mixins/validation_methods.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



3
4
5
# File 'lib/active_form/mixins/validation_methods.rb', line 3

def self.included(base)    
  base.send(:extend, ClassMethods)
end

Instance Method Details

#after_validation(prc = nil, &block) ⇒ Object Also known as: after_validation_callback=



209
210
211
# File 'lib/active_form/mixins/validation_methods.rb', line 209

def after_validation(prc = nil, &block)
  define_singleton_method(:after_validation_callback, &(block_given? ? block : prc))
end

#all_server_side_validation_advice(builder = create_builder) ⇒ Object



57
58
59
# File 'lib/active_form/mixins/validation_methods.rb', line 57

def all_server_side_validation_advice(builder = create_builder)
  server_side_validation_advice(builder, false)
end

#clear_validations!Object



158
159
160
161
# File 'lib/active_form/mixins/validation_methods.rb', line 158

def clear_validations!
  reset_errors!
  recurse(&:clear_validations!) if container?
end

#client_sideObject



95
96
97
# File 'lib/active_form/mixins/validation_methods.rb', line 95

def client_side
  @client_side_validation ||= false
end

#client_side=(value) ⇒ Object



99
100
101
# File 'lib/active_form/mixins/validation_methods.rb', line 99

def client_side=(value)
  @client_side_validation = value.to_s.to_boolean
end

#client_side?Boolean

Returns:

  • (Boolean)


87
88
89
# File 'lib/active_form/mixins/validation_methods.rb', line 87

def client_side?
  client_side == true || (contained? && container.client_side?)
end

#client_side_optionsObject



91
92
93
# File 'lib/active_form/mixins/validation_methods.rb', line 91

def client_side_options
  @client_js_options ||= { :stopOnFirst => false, :useTitles => true }
end

#client_side_validation_advice(builder = create_builder) ⇒ Object



61
62
63
64
65
66
67
# File 'lib/active_form/mixins/validation_methods.rb', line 61

def client_side_validation_advice(builder = create_builder)
  gather_validation_advice.each do |adv|
    attrs = { :id => "advice-#{adv.identifier}-#{adv.element.identifier}", :style => 'display: none', :class => "validation-advice advice-#{adv.code}" }
    get_validation_advice_wrapper.call(builder, adv, attrs)
  end
  builder.target!
end

#define_validation(prc = nil, &block) ⇒ Object Also known as: validation=, validation



169
170
171
# File 'lib/active_form/mixins/validation_methods.rb', line 169

def define_validation(prc = nil, &block)
  define_singleton_method(:validation_handler, &(block_given? ? block : prc))
end

#define_validator(type, *args, &block) ⇒ Object



7
8
9
10
11
12
# File 'lib/active_form/mixins/validation_methods.rb', line 7

def define_validator(type, *args, &block)
  args.unshift(self)
  validator = ActiveForm::Validator::build(type, *args, &block)
  validators << validator
  validator
end

#each_error(&block) ⇒ Object



123
124
125
# File 'lib/active_form/mixins/validation_methods.rb', line 123

def each_error(&block)   
  element_errors.each(&block)
end

#element_errors(first_only = false) ⇒ Object Also known as: all_errors, validation_errors



111
112
113
114
115
# File 'lib/active_form/mixins/validation_methods.rb', line 111

def element_errors(first_only = false)
  elem_errors = first_only ? [errors.first] : errors.all
  elements.each { |elem| elem_errors += elem.element_errors(first_only) } if container?
  elem_errors.compact
end

#errorsObject



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

def errors
  @errors ||= ActiveForm::Errors.new(self)
end

#every_error(&block) ⇒ Object Also known as: every_initial_error



127
128
129
# File 'lib/active_form/mixins/validation_methods.rb', line 127

def every_error(&block)   
  element_errors(true).each(&block)   
end

#format_message(msg = @@default_msg, error_code = 'default', params = []) ⇒ Object



14
15
16
17
18
# File 'lib/active_form/mixins/validation_methods.rb', line 14

def format_message(msg = @@default_msg, error_code = 'default', params = [])
  msg = (localize(name, "validates_#{error_code}") || msg) if localized?
  mparams = message_params + params
  sprintf(msg || '', *mparams)
end

#gather_validation_adviceObject



69
70
71
72
73
# File 'lib/active_form/mixins/validation_methods.rb', line 69

def gather_validation_advice    
  adv = validators.inject([]) { |ary, v| v.advice.keys.sort.inject(ary) { |a, key| a << v.advice[key] unless v.advice[key].blank? } }
  each { |elem| adv += elem.gather_validation_advice } if container?
  adv.compact    
end

#get_validation_advice_wrapperObject



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

def get_validation_advice_wrapper
  if respond_to?(:advice_wrapper)
    method_to_proc(:advice_wrapper)
  elsif self.class.respond_to?(:advice_wrapper)
    self.class.method_to_proc(:advice_wrapper)
  else
    self.class.method_to_proc(:default_validation_advice_wrapper)
  end
end

#initial_errorsObject



119
120
121
# File 'lib/active_form/mixins/validation_methods.rb', line 119

def initial_errors
  element_errors(true)
end

#javascript_validation(prc = nil, &block) ⇒ Object Also known as: javascript_validation=



191
192
193
# File 'lib/active_form/mixins/validation_methods.rb', line 191

def javascript_validation(prc = nil, &block)
  define_singleton_method(:js_validation_generator, &(block_given? ? block : prc))
end

#javascript_validation_codeObject



179
180
181
182
183
184
185
186
187
188
189
# File 'lib/active_form/mixins/validation_methods.rb', line 179

def javascript_validation_code
  return nil unless respond_to?(:js_validation_generator) || self.class.respond_to?(:js_validation_generator)
  vparams = { :name => identifier.dasherize, :msg => "#{label}: validation failed" }
  code = JavascriptAttribute.new
  js_validation_generator(self, code, vparams) if respond_to?(:js_validation_generator)
  self.class.js_validation_generator(self, code, vparams) if self.class.respond_to?(:js_validation_generator)
  return nil if code.empty? 
  class_name = "validate-#{vparams[:name]}"
  css_class << class_name unless container? || css_class.include?(class_name)
  %|Validation.add('#{class_name}', "#{vparams[:msg]}", function (v) {\n  #{code}\n});|
end

#message_paramsObject



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

def message_params
  [label, element_value]
end

#perform_validationObject



149
150
151
152
153
154
155
156
# File 'lib/active_form/mixins/validation_methods.rb', line 149

def perform_validation
  reset_errors!     
  each { |elem| elem.perform_validation } if container?
  validators.each(&:validate)
  validate_element
  after_validation_callback(self) if respond_to?(:after_validation_callback)
  return true # so you can write perform_validation && valid?
end

#required_message=(str) ⇒ Object



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

def required_message=(str)
  validator = self.validators_by_type('required').first
  validator.message = str unless validator.nil?
end

#reset_after_validation_callbackObject



214
215
216
# File 'lib/active_form/mixins/validation_methods.rb', line 214

def reset_after_validation_callback
  undefine_singleton_method(:after_validation_callback) rescue nil
end

#reset_errors!Object



132
133
134
# File 'lib/active_form/mixins/validation_methods.rb', line 132

def reset_errors!
  errors.reset
end

#reset_javascript_validationObject



196
197
198
# File 'lib/active_form/mixins/validation_methods.rb', line 196

def reset_javascript_validation
  undefine_singleton_method(:js_validation_generator) rescue nil
end

#reset_validationObject



175
176
177
# File 'lib/active_form/mixins/validation_methods.rb', line 175

def reset_validation
  undefine_singleton_method(:validation_handler) rescue nil
end

#reset_validation_advice_wrapperObject



205
206
207
# File 'lib/active_form/mixins/validation_methods.rb', line 205

def reset_validation_advice_wrapper
  undefine_singleton_method(:advice_wrapper) rescue nil
end

#server_side_validation_advice(builder = create_builder, first_only = true) ⇒ Object



50
51
52
53
54
55
# File 'lib/active_form/mixins/validation_methods.rb', line 50

def server_side_validation_advice(builder = create_builder, first_only = true)
  element_errors(first_only).inject('') do |str, error|
    attrs = { :id => "advice-#{error.identifier}-#{error.element.identifier}", :class => "validation-advice advice-#{error.code}" }
    get_validation_advice_wrapper.call(builder, error, attrs)
  end
end

#valid?Boolean

Returns:

  • (Boolean)


136
137
138
# File 'lib/active_form/mixins/validation_methods.rb', line 136

def valid?
  initial_errors.empty?
end

#validateObject



140
141
142
# File 'lib/active_form/mixins/validation_methods.rb', line 140

def validate
  perform_validation && valid?
end

#validate!Object



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

def validate!
  return true if validate  
  raise ActiveForm::ValidationException 
end

#validate_elementObject



163
164
165
166
167
# File 'lib/active_form/mixins/validation_methods.rb', line 163

def validate_element
  internal_validation(self) if respond_to?(:internal_validation)
  validation_handler(self) if respond_to?(:validation_handler)
  self.class.validation_handler(self) if self.class.respond_to?(:validation_handler)
end

#validation_advice(builder = create_builder) ⇒ Object



44
45
46
47
48
# File 'lib/active_form/mixins/validation_methods.rb', line 44

def validation_advice(builder = create_builder)
  str = server_side_validation_advice(builder)
  str << client_side_validation_advice(builder) if client_side?
  str 
end

#validation_advice_wrapper(prc = nil, &block) ⇒ Object



200
201
202
# File 'lib/active_form/mixins/validation_methods.rb', line 200

def validation_advice_wrapper(prc = nil, &block)
  define_singleton_method(:advice_wrapper, &(block_given? ? block : prc))
end

#validation_css_classObject



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

def validation_css_class
  css = validators.inject(CssAttribute.new) { |cs, v| cs << "#{v.identifier}" }
  each { |elem| css += elem.validation_css_class } if container?
  css.compact  
end

#validation_javascript_definitionsObject



81
82
83
84
85
# File 'lib/active_form/mixins/validation_methods.rb', line 81

def validation_javascript_definitions
  js = validators.inject([]) { |ary, v| ary << v.javascript_definition }.compact.join("\n")
  each { |elem| js += elem.validation_javascript_definitions } if container?
  js
end

#validatorsObject



103
104
105
# File 'lib/active_form/mixins/validation_methods.rb', line 103

def validators
  @validators ||= []
end

#validators_by_type(*types) ⇒ Object



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

def validators_by_type(*types)
  types.map(&:to_s)
  self.validators.find_all { |v| types.include?(v.code) }
end