A new Ruby on Rails validation plugin that allows you to mark model attributes as immutable.
Rails surprisingly does not include a validation method to make a model attribute immutable. (That is, the attribute can not be changed after it is set the first time.) I created this validation plugin to help that.
To install:
script/plugin install http://svn.savvica.com/public/plugins/ensures_immutability_of
To use, drop this in your model:
ensures_immutability_of :attribute_name
You can specify multiple immutable attributes in one line:
ensures_immutability_of :attribute1, :attribute2
Now if something attempts to set a protected attribute, it will raise an error. For example:
class Account < ActiveRecord::Base
ensures_immutability_of :username, :email
end
account = Account.create(:username => 'jgreen')
...
account.update(:username => 'jgreen') # raises ActiveRecord::ImmutableAttributeError
This plugin works especially nicely with the Email Veracity Plugin. If you have an email-verification process (such as sending an activation email) then you will most likely want to mark the email attribute as immutable, and create new records for when users add other email addresses.
But this is probably most excellent for username and relationship attributes (foreign key fields). That is exactly how we are using it on Languify.
Would love to hear any ideas on how to make this better! We really appreciated all the helpful feedback on the Email Veracity Plugin.
Also I would like to thank Paul Ingles for the inspiration for this plugin.
Update:
Rather than raising a RuntimeError when an attribute is modified, now a ActiveRecord::ImmutableAttributeError is raised instead. Thanks goes to Jeffery Hardy for the suggestion.


class ImmutableAttributeError < ActiveRecord::ActiveRecordError def initialize(message=nil) super(message || 'Cannot modify immutable attribute') end endThis makes it easier to test (since a RuntimeError could be anything), e.g.: