All of us have faced this situation when, the current_resource object
provided by devise turns out to be nil.
All method
invocations on current_resource
on current_resource
will throw an undefined method for nil:NilClass
exception.
To handle this, we can try one of the following.
1. current_resource.name rescue nil
2. current_resource.try(:name)
3. current_resource ? current_resource.name : nil
But, what is the most efficient way? Let’s find out.
require 'benchmark'
n = 5000000
current_resource = nil
Benchmark.bm do |x|
x.report("rescue") do n.times { current_resource.name rescue nil } end
x.report("try") do n.times { current_resource.try(:name) } end
x.report("ternary") do n.times { current_resource ? current_resource.name : nil } end
end
user system total real
--------------------------------------------------------------
rescue | 16.300000 | 0.600000 | 16.900000 | (16.910213)
try | 0.7800000 | 0.000000 | 0.7800000 | ( 0.783828)
ternary | 0.2800000 | 0.000000 | 0.2800000 | ( 0.277966)
Note that rescue is considerably inefficient compared to the other two (almost 60 times). The Ternary operator seems to be the most sound option.
Comments