MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

RoR:Mongoid e form creano hash

Quando utilizzi form_for :

Nel tuo caso, Video modello. Per comprendere la convenzione Rails:

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

Il che si traduce in un tag html il cui attributo name è video[description] . Ciò significa che al momento dell'invio del modulo, il valore inserito dall'utente sarà disponibile nel controller come params[:video][:description] .

I params variabile è un'istanza di ActiveSupport::HashWithIndifferentAccess , come un Hash con una piccola differenza, secondo la documentazione:

I tuoi params è qualcosa del tipo:

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

Dove "video" o :video è una delle chiavi dell'Hash. Quindi, params[:video] è equivalente a params.fetch("video") il cui valore è {"description"=>"Video desc"} . Come puoi vedere il valore è un altro hash. Infine per ottenere il valore della descrizione devi params[:video][:description] (The Rails way) o params.fetch("video").fetch("description") , il cui valore è "Video desc" .

fetch è un metodo Ruby di Hash :"Restituisce un valore dall'hash per la chiave data."

Tenendo conto di ciò:

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

È più facile usare le convenzioni, ma di sicuro puoi avere params[:description] (per ogni evenienza):

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

Nota che sto usando text_field_tag invece di f.text_field . In questo caso il nome del tag html sarà description nei params Hash riceverai { "description" => 'Video desc" } ...

Dai un'occhiata alla documentazione API Rails per comprendere diversi aiutanti, ecc. E anche rivedere il registro del tuo server.