-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Clarify why model[] is preferred over read_attribute #326
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you!
A small note that to be fair, you can pass a block to read_attribute with a handler when the attribute is missing, an this is exactly what [] does.
@pirj that's a good point, I can adapt the PR to take this into account. How about this?
Prefer
self[:attribute]overread_attribute(:attribute), if the latter is used without a block.self[]raises anActiveModel::MissingAttributeErrorif the attribute is missing, whereasread_attributedoes not.[source,ruby] ---- # bad def amount read_attribute(:amount) * 100 end # good def amount self[:amount] * 100 end def amount read_attribute(:amount) { 0 } * 100 end ----
I think this is unnecessary, the PR is good as is.
The point in preferring [] is to fail during the development phase making typos in attribute names obvious. I can't think of a real-world usage of a useful read_attribute fallback when the attribute doesn't really exist on the model.
After looking more into the Rails code, I found out the conclusion from the referenced discussion is not exactly correct.
If I just try any random attribute with [], I don't get an exception raised:
model[:wrong_attr] # => nil
The MissingAttributeError exception comes in when an attribute exists in the model, but is not initialized, as written in the comments before the method definition:
person = Person.select('id').first person[:name] # => ActiveModel::MissingAttributeError: missing attribute: name
The important thing to realize is that the exception is only raised when Person has a name column. Otherwise the result would be nil. Given that, I'd say the text I introduced in this PR is misleading.
Addresses #155