31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
# File 'lib/immutable_attributes.rb', line 31
def validates_immutable(*attr_names)
config = { :on => :update, :if => lambda {|x| true}, :message => "can't be changed" }
config.update(attr_names.)
@immutables = attr_names
attr_names.each do |attr|
class_eval do
define_method("original_#{attr}") do
instance_variable_get("@original_#{attr}")
end
end
end
class_eval do
def self.immutables
@immutables
end
def after_initialize; end;
def setup_originals
self.class.immutables.each do |attr_name|
next unless attribute_names.include? attr_name
instance_variable_set("@original_#{attr_name}", send(attr_name.to_s))
end
end
after_initialize :setup_originals
end
validates_each(attr_names, config) do |record, attr_name, value|
next if record.send("original_#{attr_name.to_s}").nil?
record.errors.add(attr_name, config[:message]) if record.send("original_#{attr_name.to_s}") != record.send(attr_name.to_s)
end
end
|