I’ve just put two plugins on RubyForge. Included below are the READMEs.
You can get the plugins at
svn://rubyforge.org//var/svn/valirefl/validation_reflection/trunk
svn://rubyforge.org//var/svn/clientsidevali/client_side_validation/trunk
Michael
Validation Reflection
Version 0.2, 2006-08-06
This plugin adds reflective access to validations
- ModelClass.reflect_on_all_validations
- ModelClass.reflect_on_validations_for(:property)
= Deprecation Notice
Version 0.1 had supplied three methods
- validates_presence_of_mandatory_content_columns
- validates_lengths_of_string_attributes
- validates_all_associated
These have been removed. Please use the Enforce Schema Rules plugin
instead
http://enforce-schema-rules.googlecode.com/svn/trunk/enforce_schema_rules/
Client Side Validation
Version 0.2, 2006-08-06
Requires Validation Reflection plugin.
This plugin is only a tool, it leaves some work for you to do.
The plugin happily handles the validation part, but it is your
job to handle the notification.
Let’s look at the simplest case first.
In public/javascripts/application.js put:
Form.Validator.installForAllValidatedForms();
This installs a validator for each form on the page which has the
class “validated”. If any of the form’s input elements are or become
invalid, they are marked with the class “invalid”. If you have
something like this
.invalid {
border: 1px solid #f00;
}
somewhere in your stylesheet(s), invalid fields will be marked with
a read border. This works for
- :validates_presence_of
- :validates_length_of
- :validates_numericality_of
- :validates_inclusion_of
- :validates_format_of - as far as regular expressions are matched the
same in Ruby and JavaScript
== Localization
Without further doing, the validator is not set up to handle any
specific locale. For instance, dates assumed to be in ISO 8601 format,
say 2006-08-13. To make the validator handle a specific locale, you
need to load a JavaScript file with validators for that locale. Put
<%= javascript_include_tag ‘validators-en’ %>
as the last javascript_include_tag in your layout. Currently, there
are validators-en and validators-de. And all they do is handle the
different date formats.
== Custom Checking
If you need client-side validations that can’t be expressed with these
means, you’ll have to write a validation function yourself.
Again in application.js
Object.extend(Form.Validator.Validators, {
very_special: function(value) {
// Leave the check if there actually is a value to the
// validation function set up for :validates_presence_of.
if (!this.value) {
return true;
}
// Do the ckecking…
return true;
}
});
Then, in a view where a text field (or whatever it is) needs to be
subject to this very special test
<%= text_field :object, :attribute, :class => ‘very_special’ %>
That’s it.
=== Complicated Checks
The declarative wiring of validation functions can be used for
functions that need to take into account the values of multiple
input elements. Writing these functions is a bit tricky. If you
really need such a thing, look at the code for
Form.Validator.Validators#exactly and
Form.Validator.Validators#different.
== Notifying Users of Validation Results
Form.Validator.install(‘person_form’, {
onElementStatusChange: {
person_last_name: function(isValid) {
if (!isValid) alert(this.value + " is not a valid last name.");
},
},
onFormStatusChange: function(isValid) {
if (!isValid) alert(“Your form is not valid!”);
}
});
If you provide your own +onElementStatusChange+ function for reporting
a status change, this overrides the default behavior of adding/removing
the “invalid” class to the input element. You can explicitly invoke
that behavior like this
person_last_name: function(isValid) {
Form.Validator.switchClassNameInvalid(this, isValid);
if (!isValid) alert(this.value + " is not a valid last name.");
},
Obviously, just popping up an alert box or putting a border around an
element isn’t very user friendly. Especially so for a validator like
this that checks continuously. Therefore you need to come up with a
way to notify your users of errors in a way that meshes well with the
rest of the application.
Currently, there is no way to find out which specific validation failed
for a given input element. As validations don’t have any identifiert
I’m hard pressed for a good idea.
–
Michael S.
mailto:[email protected]
http://www.schuerig.de/michael/