Rails params explicados?

228

¿Podría alguien explicar paramsen el controlador Rails: de dónde vienen y a qué se refieren?

  def create
    @vote = Vote.new(params[:vote])
    item = params[:vote][:item_id]
    uid = params[:vote][:user_id]
    @extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])
    last_vote_time = @extant.created_at unless @extant.blank?
    curr_time = Time.now
  end

Me gustaría poder leer este código línea por línea y comprender lo que está sucediendo.

Dru
fuente
2
¿Cuál es su experiencia en el desarrollo web del lado del servidor? ¿Qué tecnologías ya conoces?
Maurício Linhares
3
He estado con HTML y CSS por años. Clases tomadas que usaban PHP, JS y Java. Sin embargo, usé muy poco MVC con php. Realmente aprendí programación usando Java. Y entiendo completamente la teoría de la base de datos.
Dru

Respuestas:

281

Los parámetros provienen del navegador del usuario cuando solicitan la página. Para una solicitud HTTP GET, que es la más común, los parámetros están codificados en la url. Por ejemplo, si el navegador de un usuario solicita

http://www.example.com/?foo=1&boo=octopus

entonces params[:foo]sería "1" y params[:boo]sería "pulpo".

En HTTP / HTML, los parámetros son realmente solo una serie de pares clave-valor donde la clave y el valor son cadenas, pero Ruby on Rails tiene una sintaxis especial para hacer que los parámetros sean un hash con hashes dentro. Por ejemplo, si el navegador del usuario solicitó

http://www.example.com/?vote[item_idfont>=1&vote[user_idfont>=2

entonces params[:vote]sería un hash, params[:vote][:item_id]sería "1" y params[:vote][:user_id]sería "2".

Los parámetros de Ruby on Rails son el equivalente de la matriz $ _REQUEST en PHP .

David Grayson
fuente
13
Equivalente a $ _REQUEST, excepto que $ _REQUEST incluye datos de obtención, publicación y cookies, mientras que los parámetros solo obtienen y publican datos.
Parziphal
3
Los datos de POST @renocor también se incluyen en el paramshash de Rails . Los datos de cookies se incluyen en el sessionhash.
Richard Jones el
Esta respuesta deja de lado otra fuente de parámetros: la URL. Vea la respuesta de hammar para más información.
Richard Jones el
1
toasterlovin, parece que no leíste la segunda oración de mi respuesta ni miraste el primer ejemplo.
David Grayson
1
@AnkitDhingra ... Creo que siempre será una cadena ya que los parámetros HTTP son realmente solo par clave / valor y Rails (probablemente Gema de Rack) analiza eso en hashes y matrices de acuerdo con el valor clave, pero no he visto nada por el estilo que le dice a Rails que el valor es un número.
rubyprince
75

Como otros han señalado, los paramsvalores pueden provenir de la cadena de consulta de una solicitud GET o de los datos del formulario de una solicitud POST, pero también hay un tercer lugar del que pueden provenir: la ruta de la URL.

Como sabrás, Rails usa algo llamado rutas para dirigir las solicitudes a sus acciones de controlador correspondientes. Estas rutas pueden contener segmentos que se extraen de la URL y se colocan en params. Por ejemplo, si tiene una ruta como esta:

match 'products/:id', ...

A continuación, una petición a una URL como http://example.com/products/42conjunto voluntad params[:id]a 42.

hammar
fuente
¿Cómo se obtiene un segundo parámetro? like / squad / id / member / id / stuff
weteamsteve
48

Params contiene los siguientes tres grupos de parámetros:

  1. Parámetros proporcionados por el usuario
    • OBTENER (http://domain.com/url?param1=value1¶m2=value2 establecerá los parámetros [: param1] y params [: param2])
    • POST (por ejemplo, JSON, XML se analizará automáticamente y se almacenará en parámetros)
    • Nota: De forma predeterminada, Rails duplica los parámetros proporcionados por el usuario y los almacena en parámetros [: usuario] si en UsersController, se puede cambiar con la configuración wrap_parameters
  2. Parámetros de enrutamiento
    • match '/user/:id' en routes.rb establecerá los parámetros [: id]
  3. Parámetros por defecto
    • params[:controller]y params[:action]siempre está disponible y contiene el controlador y la acción actuales
thejaz
fuente
1
¿Podría expandir su Nota en User supplied parametersun poco más? Por ejemplo, un ejemplo del hash de params en el UsersController sería útil. Su ejemplo hace que parezca que el hash se verá así: {first_name: "mike", user: {first_name: "mike"} ...} ¿Es correcto?
7stud
1
No veo eso en los rieles 4. Por ejemplo, {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "action"=>"update", "controller"=>"apples", "id"=>"4"}. Perdóname si me equivoco, soy un principiante de rieles. Según su nota, debería ver: {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "apple" => {"ripe"=>"true"}, "action"=>"update", "controller"=>"apples", "id"=>"4"} no sé si eso tiene que ver con parámetros fuertes en rails4 o no.
7stud
2
Veo los parámetros duplicados en Rails 4, pero solo bajo solicitudes POST json (usando Angularjs) no bajo las propias publicaciones HTML de Rails. Este enlace explica por qué: stackoverflow.com/questions/10774972/…
Homan
13

Básicamente, los parámetros son datos especificados por el usuario para la aplicación rails.

Cuando publica un formulario, generalmente lo hace con la solicitud POST en lugar de la solicitud GET. Puede pensar que las solicitudes de rieles normales son solicitudes GET, cuando navega por el sitio, si es útil.

Cuando envía un formulario, el control se devuelve a la aplicación. ¿Cómo obtiene los valores que ha enviado al formulario? paramses como.

Sobre tu código. @vote = Vote.new params[:vote]crea una nueva base de datos Vote to utilizando datos de parámetros [: vote]. Dado que su formulario enviado por el usuario fue nombrado con el nombre: vote, todos los datos se encuentran en este: campo de votación del hash.

Las siguientes dos líneas se utilizan para obtener el elemento y el usuario uid lo ha enviado al formulario.

@extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])

encuentra el voto más nuevo o el último insertado de la base de datos con las condiciones item_id = item y user_id = uid.

Las siguientes líneas toman el tiempo de la última votación y la hora actual.

Smar
fuente
6

En el lado de Rails, paramses un método que devuelve un ActionController::Parametersobjeto. Ver https://stackoverflow.com/a/44070358/5462485

Margotte
fuente
3
+1 para aclarar que paramses un método. Ruby puede dificultar la distinción de variables de métodos
samrap