När du använder form_for
:
I ditt fall, Video
modell. För att förstå Rails-konventionen:
<%= form_for @video do |f| %>
...
<%= f.text_field :description %>
...
Vilket resulterar i en HTML-tagg vars namnattribut är video[beskrivning] . Detta innebär att när formuläret skickas kommer värdet som angetts av användaren att vara tillgängligt i kontrollern som params[:video][:beskrivning] .
params
variabeln är en instans av ActiveSupport::HashWithIndifferentAccess
, som en Hash
med en liten skillnad, enligt dokumentation:
Dina params
är något i stil med:
{"utf8"=>"✓",
"_method"=>"post",
"authenticity_token"=>"xxx",
"video"=>
{"description"=>"Video desc"}
}
Där "video"
eller :video
är en av nycklarna till Hash. Så, params[:video]
motsvarar params.fetch("video")
vilket värde är {"description"=>"Video desc"}
. Som du kan se är värdet en annan Hash. Slutligen för att få värdet av beskrivningen måste du params[:video][:description]
(The Rails way) eller params.fetch("video").fetch("description")
, vilket värde är "Video desc"
.
fetch
är en Ruby-metod för Hash
:"Returnerar ett värde från hashen för den givna nyckeln."
Med hänsyn till detta:
Video.new(params[:video]) = Video.new(:description => "Video desc") = Video.new(:description => params[:video][:description])
Det är lättare att använda konventioner, men du kan säkert ha params[:description]
(för säkerhets skull):
<%= form_for @video do |f| %>
...
<%= text_field_tag :description %>
...
Observera att jag använder text_field_tag
istället för f.text_field
. I det här fallet kommer html-taggen att vara description
i params
Hash du kommer att få { "description" => 'Video desc" }
...
Ta en titt på Rails API-dokumentation för att förstå olika hjälpare etc. Och även granska din servers logg.