Når du bruger form_for
:
I dit tilfælde Video
model. Sådan forstår du Rails-konventionen:
<%= form_for @video do |f| %>
...
<%= f.text_field :description %>
...
Hvilket resulterer i et html-tag, hvis navneattribut er video[beskrivelse] . Det betyder, at når formularen indsendes, vil den værdi, som brugeren har indtastet, være tilgængelig i controlleren som parametre[:video][:beskrivelse] .
params
variabel er en instace af ActiveSupport::HashWithIndifferentAccess
, som en Hash
med en lille forskel, ifølge dokumentation:
Dine params
er noget i stil med:
{"utf8"=>"✓",
"_method"=>"post",
"authenticity_token"=>"xxx",
"video"=>
{"description"=>"Video desc"}
}
Hvor "video"
eller :video
er en af nøglerne til Hash. Så params[:video]
svarer til params.fetch("video")
hvilken værdi er {"description"=>"Video desc"}
. Som du kan se er værdien en anden Hash. Til sidst for at få værdien af beskrivelsen skal du params[:video][:description]
(The Rails way) eller params.fetch("video").fetch("description")
, hvilken værdi er "Video desc"
.
fetch
er en Ruby-metode til Hash
:"Returnerer en værdi fra hashen for den givne nøgle."
Tager du dette i betragtning:
Video.new(params[:video]) = Video.new(:description => "Video desc") = Video.new(:description => params[:video][:description])
Det er nemmere at bruge konventioner, men du kan helt sikkert have params[:description]
(bare for en sikkerheds skyld):
<%= form_for @video do |f| %>
...
<%= text_field_tag :description %>
...
Bemærk, at jeg bruger text_field_tag
i stedet for f.text_field
. I dette tilfælde vil html-tagnavnet være description
i params
Hash vil du modtage { "description" => 'Video desc" }
...
Tag et kig på Rails API-dokumentation at forstå forskellige hjælpere osv. Og også gennemgå din servers log.