23
24
25
26
27
28
29
30
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
|
# File 'lib/immutable_attributes.rb', line 23
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 |meth|
class_eval do
define_method("original_#{meth}") do
instance_variable_get("@original_#{meth}")
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|
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
|