MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

RoR :Mongoid et form créent un hash

Lorsque vous utilisez form_for :

Dans votre cas, Video maquette. Pour comprendre la convention Rails :

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

Ce qui se traduit par une balise html dont l'attribut name est video[description] . Cela signifie que lorsque le formulaire est soumis, la valeur saisie par l'utilisateur sera disponible dans le contrôleur sous la forme params[:video][:description] .

Les params la variable est une instance de ActiveSupport::HashWithIndifferentAccess , comme un Hash avec une petite différence, selon la documentation :

Vos params est quelque chose comme :

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

"video" ou :video est l'une des clés du Hash. Donc, params[:video] est équivalent à params.fetch("video") dont la valeur est {"description"=>"Video desc"} . Comme vous pouvez le voir, la valeur est un autre hachage. Enfin pour obtenir la valeur de la description il faut params[:video][:description] (La manière Rails) ou params.fetch("video").fetch("description") , dont la valeur est "Video desc" .

fetch est une méthode Ruby de Hash :"Renvoie une valeur à partir du hachage pour la clé donnée."

En tenant compte :

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

Il est plus facile d'utiliser les conventions, mais vous pouvez certainement avoir params[:description] (juste au cas où):

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

Notez que j'utilise text_field_tag au lieu de f.text_field . Dans ce cas, le nom de la balise html sera description dans les params Hash vous recevrez { "description" => 'Video desc" } ...

Consultez la documentation de l'API Rails pour comprendre les différents assistants, etc. Et aussi consulter le journal de votre serveur.