attributes
returns a hash of all attributes for the user and ['first_name']
just accesses the specified parameter of the hash, whereas read_attribute
just returns the single parameter asked for. You don't really need either of those methods to access the name as this can be done which makes the code a lot cleaner:
user = User.new(name:'John')
user.name
=> 'John'