sql >> Base de Datos >  >> NoSQL >> MongoDB

RoR:mongoide y formulario crean hash

Cuando estás usando form_for :

En tu caso, Video modelo. Para entender la convención de Rails:

<%=  form_for @video do |f| %>
...
<%= f.text_field :description %>
...

Lo que da como resultado una etiqueta html cuyo atributo de nombre es video[descripción] . Esto significa que cuando se envía el formulario, el valor ingresado por el usuario estará disponible en el controlador como params[:video][:description] .

Los params la variable es una instancia de ActiveSupport::HashWithIndifferentAccess , como un Hash con una pequeña diferencia, según la documentación:

Tus params es algo como:

{"utf8"=>"✓",
 "_method"=>"post",
 "authenticity_token"=>"xxx",
 "video"=>
  {"description"=>"Video desc"}
}

Donde "video" o :video es una de las claves del Hash. Entonces, params[:video] es equivalente a params.fetch("video") cuyo valor es {"description"=>"Video desc"} . Como puede ver, el valor es otro Hash. Finalmente, para obtener el valor de la descripción, debe params[:video][:description] (al estilo Rails) o params.fetch("video").fetch("description") , cuyo valor es "Video desc" .

fetch es un método Ruby de Hash :"Devuelve un valor del hash para la clave dada".

Teniendo esto en cuenta:

Video.new(params[:video]) = Video.new(:description => "Video desc") = Video.new(:description => params[:video][:description])

Es más fácil usar convenciones, pero seguro que puede tener params[:description] (por si acaso):

<%=  form_for @video do |f| %>
...
<%= text_field_tag :description %>
...

Tenga en cuenta que estoy usando text_field_tag en lugar de f.text_field . En este caso, el nombre de la etiqueta html será description en los params Hash que recibirás { "description" => 'Video desc" } ...

Eche un vistazo a la documentación de la API de Rails para comprender diferentes ayudantes, etc. Y también revise el registro de su servidor.