How to make field in model immutable after create


#1

Hello everyone!

I want to have login field in User model which is set only once (on
create), and then it should fail validation if the value is changed.
How can I do this? I dig around for validation and tried

def after_validation_on_update
unless User.find_by_login(:login)
errors.add(:login, “is immutable. You can’t change it”)
end
end

in model, but somewhat it doesn’t work. Any hints on how can I make
field immutable after create?

Peace,
olegf


#2

I’m almost positive there’s a better way, but you could try something
like this in the validate method of your model.

def validate

errors.add( :login, "Can't change your login details") if

self.login != User.find(self.id).login

end


#3

Sorry there should be another line in that method

def validate
if not self.new_record?
errors.add( :login, “Can’t change your login details”) if
self.login != User.find(self.id).login
end
end


#4

Yep, just do:

class User < ActiveRecord::Base
def login=(value)
# Either ignore the call, add an error, or raise an exception
end
end


#5

Can you just override the default setter that active records creates in
your model and throw an execption if it gets called?


What’s an Intel chip doing in a Mac? A whole lor more that it’s ever
done in a PC.

My Digital Life - http://scottwalter.com/blog
Pro:Blog - http://scottwalter.com/problog
Snippets - http://snippets.scottwalter.com

----- Original Message ----
From: Oleg F. removed_email_address@domain.invalid
To: removed_email_address@domain.invalid
Sent: Monday, May 8, 2006 12:53:13 AM
Subject: [Rails] how to make field in model immutable after create

Hello everyone!

I want to have login field in User model which is set only once (on
create), and then it should fail validation if the value is changed.
How can I do this? I dig around for validation and tried

def after_validation_on_update
unless User.find_by_login(:login)
errors.add(:login, “is immutable. You can’t change it”)
end
end

in model, but somewhat it doesn’t work. Any hints on how can I make
field immutable after create?

Peace,
olegf


#6

If you make it so that the setter method throws an exception/stops the
call,
how do you set the login when the record is first created?


#7

Something along the lines of…

def login= (value)
if new_record?
self[:login] = value
else
raise “You can’t change login”
end
end