27

I occasionally see attribute accessors/readers/writers in the code for models. Are these necessary if I want to be able to update attributes from the view / controller code?

I am a beginner so I am really talking about basic applications.

max pleaner
  • 26,189
  • 9
  • 66
  • 118

4 Answers4

60

attr_accessor is a core feature of Ruby and is used to generate instance variables with getter and setter methods. Its use is never required in basic Ruby (it's a convenience).

In the case of ActiveRecord models, getters and setters are already generated by ActiveRecord for your data columns. attr_accessor is not needed or desirable.

If you have additional instance data you don't need to persist (i.e. it's not a database column), you could then use attr_accessor to save yourself a few lines of code.

The similarly-named attr_accessible — which is frequently seen in Rails code and confused with attr_accessor — is a deprecated method of controlling mass assignment within ActiveRecord models. Rails 4 doesn't support it out of the box; it has been replaced by Strong Parameters, which allows more granular control.

colinm
  • 4,258
  • 24
  • 19
27

If you declare an attr_accessor then you can use it as a virtual attribute, which is basically an attribute on the model that isn't persisted to the database.

Example case: you declare attr_accessor :password in your User model so that you can use it as a field in a new user form. When you receive their password in the corresponding create action, you can derive a hashed_password, persist it to the database, and discard the given password (which is done automatically at the end of the request).

Kaleidoscope
  • 3,609
  • 1
  • 26
  • 21
3

Generally it is a pretty good idea to decorate attr_accessor for anything on a model that is not an actual column in the SQL table. Rails 4 or not. This gives you clear understanding of what's in the model and what is persisted.

Jason Gilmore
  • 3,698
  • 3
  • 23
  • 28
Nikolay
  • 1,392
  • 1
  • 9
  • 15
0

Generally, i use attr_accessor for attributes that is not in model/database, but i think it's not necessary using them.

jorgedjr21
  • 111
  • 5