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.