Rails 100% newb issue - send() method

前端 未结 3 1528
梦如初夏
梦如初夏 2021-01-31 08:52

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.<

相关标签:
3条回答
  • 2021-01-31 09:12

    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.

    0 讨论(0)
  • 2021-01-31 09:16

    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.

    0 讨论(0)
  • 2021-01-31 09:23

    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!

    0 讨论(0)
提交回复
热议问题