Blow up when things are wrong
ActiveRecord edition
Vesa Vänskä, Kisko LabsHelsinki Ruby Brigade, Rails Girls
When something is wrong, you should know
about it as fast as possible
#save vs #save!
foo.save!
# or
if foo.save # successelse # failend
The case of updating attributes
Validations Callbacks
#update_attributes ✔ ✔
#update_attribute ✖ ✔
Question
Which of #decrement, #decrement!, and
#decrement_counter skip validations/
callbacks?
Validations Callbacks
#decrement ✔ ✖
#decrement! ✖ ✔
#decrement_counter ✖ ✖
http://guides.rubyonrails.org/active_record_validations_callba
cks.html
ATK
Do Not WantRubyGem
https://github.com/garybernhardt/do_not_want
Making it simpler
In Rails 3.2.7 the #update_attribute method was
actually deprecated
14.6.2012 – #update_attribute is deprecated in 3.2 branch
14.6.2012 – #update_attribute was removed from 4.0 branch
24.7.2012 – #update_column was deprecated in 4.0 branch
26.7.2012 – Rails 3.2.7 release
30.7.2012 – #update_column is undeprecated in 4.0 branch
1.8.2012 – #update_attribute is undeprecated in 3.2 branch
25.8.2012 – #update_attribute is put back in 4.0 branch
9.8.2012 – Rails 3.2.8 release
• https://github.com/rails/rails/commit/b081f6b59fb3f15d12043072ad9b331ffd2bc56e
• https://github.com/rails/rails/pull/6738
• https://github.com/rails/rails/pull/1190
• https://github.com/rails/rails/commit/4ac81de52fbcdabc68f6d1fa8a5ee9ff7fff7df1
• https://github.com/rails/rails/commit/50bdb924ba26999a468ec4844917cefec39ba08c
• https://github.com/rails/rails/commit/81542f95d25825a7d3eff87d6f706661bf553b18
Links
I
What is thecurrent status?
After all this
•In Rails 4 the recommended way is to use #update with a hash
•#update_attributes is aliased to #update
•#update_attribute is still skipping validations
Vesa's laws ofupdating attributes
1.Use #update_attributes or use setters and #save/#save!
2.All other methods of updating attributes need an accompanying comment that explains why you didn't follow the first rule.
Useless ActiveResource information
•ActiveResource #update_attribute will run validations normally
Extra Ruby tip
{foo: "bar"}[:foo]
{foo: "bar"}.fetch(:foo)
{foo: "bar"}[:foo] #=> "bar"
{foo: "bar"}.fetch(:foo)#=> "bar"
{foo: "bar"}[:whatevs]
{foo: "bar"}.fetch(:whatevs)
{foo: "bar"}[:whatevs] #=> nil
{foo: "bar"}.fetch(:whatevs) #=> KeyError: key not found: :whatevs
{foo: "bar"}.fetch(:whatevs, :not_found)#=> :not_found
{foo: "bar"}.fetch(:whatevs) { 1 + 1 }#=> 2
Thank you!twitter.com/vesanvesavanska.com