What is the send() method used for?
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.
What is the point of using send instead of a normal method call?
It can come in handy if you don't know in advance the name of the method, when you're doing metaprogramming for example, you can have the name of the method in a variable and pass it to the send
method.
It can also be used to call private methods, although this particular usage is not considered to be a good practice by most Ruby developers.
class Test
private
def my_private_method
puts "Yay"
end
end
t = Test.new
t.my_private_method # Error
t.send :my_private_method #Ok
You can use public_send
though to only be able to call public methods.
What does send() do in Ruby?
send
sends a message to an object instance and its ancestors in class hierarchy until some method reacts (because its name matches the first argument).
Practically speaking, those lines are equivalent:
1.send '+', 2
1.+(2)
1 + 2
Note that send
bypasses visibility checks, so that you can call private methods, too (useful for unit testing).
If there is really no variable before send, that means that the global Object is used:
send :to_s # "main"
send :class # Object
What is the difference between res.end() and res.send()?
First of all, res.send()
and res.end()
are different.
res.send()
will send the HTTP response. Its syntax is,
res.send([body])
The body parameter can be a Buffer object, a String, an object, or an Array. For example:
res.send(new Buffer('whoop'));
res.send({ some: 'json' });
res.send('<p>some html</p>');
res.status(404).send('Sorry, we cannot find that!');
res.status(500).send({ error: 'something blew up' });
See this for more info.
res.end()
will end the response process. This method actually comes from Node core, specifically the response.end()
method of http.ServerResponse
. It is used to quickly end the response without any data. For example:
res.end();
res.status(404).end();
Read this for more info.
send method in Ruby
First of all, things like []
(array index) and []=
are just methods in Ruby. x
is an Array
, and arrays have a []=
method, which accepts two arguments, an index and a value to set.
Using send
lets you pass an arbitrary "message" (method call) to object, with arbitrary parameters.
You could call x.send :sort
, for example, to send the "sort" message to the array. Sort doesn't need any parameters, though, so we don't have to pass anything extra to it.
x#[]=
, on the other hand, accepts two arguments. Its method can be thought of to look like this:
def []=(index, value)
self.set_value_at_index(index, value)
end
So, we can just invoke it with send :[]=, 0, 2
, which is just like calling x[0] = 2
. Neat, huh?
Why is an OPTIONS request sent and can I disable it?
edit 2018-09-13: added some precisions about this pre-flight request and how to avoid it at the end of this reponse.
OPTIONS
requests are what we call pre-flight
requests in Cross-origin resource sharing (CORS)
.
They are necessary when you're making requests across different origins in specific situations.
This pre-flight request is made by some browsers as a safety measure to ensure that the request being done is trusted by the server.
Meaning the server understands that the method, origin and headers being sent on the request are safe to act upon.
Your server should not ignore but handle these requests whenever you're attempting to do cross origin requests.
A good resource can be found here http://enable-cors.org/
A way to handle these to get comfortable is to ensure that for any path with OPTIONS
method the server sends a response with this header
Access-Control-Allow-Origin: *
This will tell the browser that the server is willing to answer requests from any origin.
For more information on how to add CORS support to your server see the following flowchart
http://www.html5rocks.com/static/images/cors_server_flowchart.png
edit 2018-09-13
CORS OPTIONS
request is triggered only in somes cases, as explained in MDN docs:
Some requests don’t trigger a CORS preflight. Those are called “simple requests” in this article, though the Fetch spec (which defines CORS) doesn’t use that term. A request that doesn’t trigger a CORS preflight—a so-called “simple request”—is one that meets all the following conditions:
The only allowed methods are:
- GET
- HEAD
- POST
Apart from the headers set automatically by the user agent (for example, Connection, User-Agent, or any of the other headers with names defined in the Fetch spec as a “forbidden header name”), the only headers which are allowed to be manually set are those which the Fetch spec defines as being a “CORS-safelisted request-header”, which are:
- Accept
- Accept-Language
- Content-Language
- Content-Type (but note the additional requirements below)
- DPR
- Downlink
- Save-Data
- Viewport-Width
- Width
The only allowed values for the Content-Type header are:
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
No event listeners are registered on any XMLHttpRequestUpload object used in the request; these are accessed using the XMLHttpRequest.upload property.
No ReadableStream object is used in the request.
Related Topics
How to Rescue Model Transaction and Show the User an Error
How to Write Specs for Code That Depends on Environment Variables
How to Set a Blank Value for an F.Select Form Field
Finding All the Users That Have Duplicate Names
How to Read Lines from File into Array
How to Pass Arguments from the Parent Task to the Child Task in Rake
Build Hash from Collection of Activerecord Models
Getting Memory Usage of My Process from Osx Using Ruby
How to Filter an Array of Hashes to Get Only the Keys in Another Array
Ruby on Rails, Two Models in One Form
Ruby: How to Count the Number of Times a String Appears in Another String
How to Send Mail with Rails Without a Template
How to Read the Body Text of an Email Using Ruby's Net/Imap Library
Generate a Migration File from Schema.Rb
Using Polymorphic Paths with Nested Associations
Ruby Unable to Parse a CSV File: CSV::Malformedcsverror (Illegal Quoting in Line 1.)