Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby on Rails - Is params a method or a hash?

So, I am trying out the Getting Started section of the Ruby on Rails guides here.

I did not understand a line in this tutorial. Quoting it:

The params method is the object which represents the parameters (or fields) coming in from the form.

I do have some previous experience in rails, and I always assumed params is a hash. But here they call it a method which is an object.

Is params a method or a hash? Also, in ruby, are methods also objects?

like image 355
mridula Avatar asked May 19 '17 11:05

mridula


People also ask

Is params a hash?

params is a method on the ActionController::StrongParameter class. While params appears to be a hash, it is actually an instance of the ActionController::Parameters class.

What is params in Ruby on Rails?

Specifically, params refers to the parameters being passed to the controller via a GET or POST request. In a GET request, params get passed to the controller from the URL in the user's browser. For example, if our app's controller looked like. def show. @person = Person.find(params[:name])

What are params?

Params is short for the word parameter. A parameter is a key-value pair that is encoded in a HTTP request. There are three kinds of params: user supplied parameters , routing parameters , and default parameters .

Are Rails params strings?

Note that parameter values are always strings; Rails does not attempt to guess or cast the type.


2 Answers

  • params is a method that returns an ActionController::Parameters object. Think of it something like this:

    def params
      ActionController::Parameters.new(...)
    end
    

    Example (somewhere in your controller or view):

    puts params
    #=> <ActionController::Parameters ...>
    puts params.is_a? Object
    #=> true
    
  • A method in Ruby always return a value (note: nil is also a value) unless that method is not defined. Keep in mind though that params is already defined by Rails even if you do not see it in your code)

  • Every "returned value" of a method in Ruby is an object. Even nil value is a NilClass object. Integers, Strings, Arrays, and Hashes are also objects. Why? Because eveeeeery thing inherits/starts of from the Object class.

  • If < Rails 5.1:

    • ActionController::Parameters inherits from Hash class, which means that you can use all Hash methods (see Hash methods here).

      Example:

      params.sort ...
      params.each ...
      params.has_key?(:controller)
      
  • But now at >= Rails 5.1:

    • ActionController::Parameters NO LONGER inherits from Hash class, so you would think that you can no longer use methods such as the above code like .sort, or .has_key?, but you still can! because ActionController::Parameters defines its own custom methods that "look like" methods from a Hash.
      • NOTE: Not all Hash methods are redefined in ActionController::Parameters. Feel free to compare the methods HERE and HERE, in particular sort method which is Hash method was not redefined in ActionController::Parameters, so you can't do params.sort anymore in Rails >= 5.1.
like image 195
Jay-Ar Polidario Avatar answered Oct 01 '22 18:10

Jay-Ar Polidario


  1. The description is a little bit truncated. To be precise, it should be read as:

    The return value of the params method is [an] object ...

    A method is not an object, but when you execute a method, it always returns an object. In this case, params is a method, not an object, but has a return value, which is an object.

  2. In older versions of Rails, the return value of params used to be a hash, but now, it isn't a hash.

like image 25
sawa Avatar answered Oct 01 '22 18:10

sawa