Forum: Ruby on Rails Prevent attribute from being changed with "attr_readonly"

Posted by Learn by Doing (learnbydoing)
on 2009-07-02 22:19
Is there a way to prevent an attribute from being changed from outside
the class instance? So that after a record is created, the attribute can
be read but cannot be changed from outside the class instance.

At first glance, "attr_readonly" seems to be the solution.  However,
will "attr_readonly" also prevent the attribute from being changed even
from inside the class?

In other words, will the following method successfully change the values
of attribute_a and attribute_b in model A?

1.Class A < ActiveRecord::Base
2.  attr_readonly :attribute_a, :attribute_b
3.  def change_attributes(new_a, new_b)
4.     self.attribute_a = new_a
5.     self.attribute_b = new_b
6.     save!
7.  end
8. end

I know I can redefine the write accessor if I want to customize the way
a single attribute is changed. However here I would like to change two
attributes in one transaction and prevent each attribute from being
changed individually.

Thanks


--------------------------------------------------------------------------------
Developing with Rails 2.3.2; Ruby 1.8.7 (2009-04-08 patchlevel 160)
[powerpc-darwin9]
Posted by Learn by Doing (learnbydoing)
on 2009-07-03 09:53
I tried to make private the write accessor for an attribute (e.g., foo) 
that I want to protect by defining:

Code :   - fold - unfold

   1. def foo=val
   2.   super
   3. end

However, when I make the write accessor private, I cannot even call it 
from inside the class because a statement such as self.foo = val returns 
NoMethodError: Attempt to call private method
Please help.  Thanks.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.