JackDanger / immutable_attributes

specify attributes within an ActiveRecord model that can be set but not modified

This URL has Read+Write access

JackDanger (author)
Thu Mar 19 11:08:52 -0700 2009
commit  eeec7a6ccf4dd3059fce979a8b478972f57a5598
tree    6c3737e8dbca0ac4225737a89ebfb89cd96a31af
parent  916c1b33d2cf95bbdf6a6e5b95275696062b7582
name age message
file .gitignore Sat Oct 18 07:27:32 -0700 2008 Added a validates_immutable validation. [Terry Heath]
file Manifest.txt Thu Mar 19 11:08:10 -0700 2009 updating Manifest [JackDanger]
file README Sat Oct 18 07:27:32 -0700 2008 Added a validates_immutable validation. [Terry Heath]
file Rakefile Wed Mar 04 12:14:03 -0800 2009 fixing my email address [JackDanger]
file immutable_attributes.gemspec Thu Mar 19 11:08:52 -0700 2009 updating gemspec [JackDanger]
file init.rb Tue Dec 16 23:12:37 -0800 2008 adding tests. [JackDanger]
file install.rb Fri Aug 03 16:47:42 -0700 2007 better readme git-svn-id: http://svn.6brand.co... [studioda]
directory lib/ Tue Dec 16 23:14:00 -0800 2008 preparing for gem release [JackDanger]
directory rails/ Thu Mar 27 13:09:59 -0700 2008 Configuring for Rails GemLocator [JackDanger]
directory test/ Tue Dec 16 23:12:37 -0800 2008 adding tests. [JackDanger]
file uninstall.rb Fri Aug 03 16:38:33 -0700 2007 A tiny plugin that allows you to set several at... [studioda]
README

ImmutableAttributes
===================

When you want to prevent certain attributes from being changed once set you can declare them as immutable:

class MyModel < ActiveRecord::Base
  attr_immutable :permalink, :param_identifier
end

When MyModel.find(:first).permalink = 'anything' is called it will raise an ImmutableAttributeError
MyModel.new.permalink = 'works!' will properly set the value because the record is unsaved.

If you'd only like this to happen for certain conditions, and want to handle other attribute-writers, too (like 
update_attribute), you can use the validation.

validates_immutable :permalink

Configuration options for the validation:
* :message - A customer error message (default is: "can't be changed")
* :if - Specifies a method, proc, or string to call to determine if the validation should occure (e.g., :if => 
:allow_validation or :if => Proc.new{|user| user.signup_step > 2}. The method, proc or string should return or evaluate 
to a true or false value.
* :unless - Specifies a method, proc, or string to call to determine if the validation should not occure (e.g., :unless 
=> :skip_validation or :unless => Proc.new{|user| user.signup_step <= 2}. The method, proc or string should return or 
evaluate to a true or false value.

Created by Jack Danger Canty @ http://6brand.com
Released under the same licence as Rails (MIT)