Could someone please help me to understand what the \'send()\' method listed below is used for? The code below, when I am reading it, makes no sense what purpose it\'s serving.<
send
is used to pass a method (and arguments) to an object. It's really handy when you don't know in advance the name of the method, because it's represented as a mere string or symbol.
Ex: Performer.find(params[:performer_id])
is the same as Performer.send(:find, params[:performer_id])
Beware here because relying on params when using send
could be dangerous: what if users pass destroy
or delete
? It would actually delete your object.
The send
method is the equivalent of calling the given method on the object. So if the selected_track
variable has a value of 1234, then @performer.send(selected_track)
is the same as @performer.1234
. Or, if selected_track
is "a_whiter_shade_of_pale" then it's like calling @performer.a_whiter_shade_of_pale
.
Presumably, then, the Performer class overrides method_missing
such that you can call it with any track (name or ID, it isn't clear from the above), and it will interpret that as a search for that track within that performer's tracks.
The Ruby implementation for the send
method, which is used to send a method message to an object, works like this:
class Car
def start
puts "vroom"
end
private
def engine_temp
puts "Just Right"
end
end
@car = Car.new
@car.start # output: vroom
@car.send(:start) # output: vroom
That's the basics, an additional piece of important information is that send will allow you you send in messages to PRIVATE methods, not just public ones.
@car.engine_temp # This doesn't work, it will raise an exception
@car.send(:engine_temp) # output: Just Right
As for what your specific send call will do, more than likely there is a def method_missing
in the Performer
class that is setup to catch that and perform some action.
Hope this helps, good luck!