Validation Sets
A Rails plugin to bundle validations in sets. You can turn entire sets of validations on or off on an instance. This allows you to use different sets of validations for various user roles in the application, or for different stages in the lifetime of the model.
validation_set_for(:activation) do |set|
set.validates_presence_of :fullname, :username, :email
set.validate :password_should_fit_requirements
end
The Case of the Organization
Let’s assume we have an organization in our application. The organization represents a company using the application. Administrators add these organizations, but often they don’t have all the information about the company yet. It’s up to the contact at the organization to complete it.
class Organization < ActiveRecord::Base
validates_presence_of :name
validation_set_for(:contact) do |set|
set.validates_presence_of :address, :zipcode, :city
end
end
Now we can have two controllers, one of the administrator and one for the contact. For the administrator we don’t run any validations except on name so she can choose to fill out any of the field.
class Administrator::OrganizationsController < ActionController::Base
allow_access :administrator
def create
@organization = Organization.new(params[:organization])
if @organization.save
redirect_to [:administrator, @organization]
else
render :new
end
end
end
For the contact we turn on the extra set of validations for the contact so all the fields need to be filled out.
class Contact::OrganizationsController < ActionController::Base
allow_access(:contact) { @organization = @authenticated.organization }
def update
@organization.attributes = params[:organization].slice(:address, :zipcode, :city)
@organization.use_validation_set(:contact)
if @organization.save
redirect_to [:contact, @organization]
else
render :edit
end
end
end