Gdy używasz form_for
:
W Twoim przypadku Video
Model. Aby zrozumieć konwencję Railsów:
<%= form_for @video do |f| %>
...
<%= f.text_field :description %>
...
Co skutkuje tagiem HTML, którego atrybut name to video[description] . Oznacza to, że po przesłaniu formularza wartość wprowadzona przez użytkownika będzie dostępna w kontrolerze jako parametry[:video][:description] .
params
zmienna jest instancją ActiveSupport::HashWithIndifferentAccess
, jak Hash
z niewielką różnicą, zgodnie z dokumentacją:
Twoje params
to coś takiego:
{"utf8"=>"✓",
"_method"=>"post",
"authenticity_token"=>"xxx",
"video"=>
{"description"=>"Video desc"}
}
Gdzie "video"
lub :video
jest jednym z kluczy skrótu. A więc params[:video]
jest odpowiednikiem params.fetch("video")
która wartość to {"description"=>"Video desc"}
. Jak widać wartość to kolejny skrót. Na koniec, aby uzyskać wartość opisu, musisz params[:video][:description]
(Sposób Rails) lub params.fetch("video").fetch("description")
, którego wartość to "Video desc"
.
fetch
to Ruby metoda Hash
:"Zwraca wartość hash dla podanego klucza."
Biorąc to pod uwagę:
Video.new(params[:video]) = Video.new(:description => "Video desc") = Video.new(:description => params[:video][:description])
Łatwiej jest używać konwencji, ale na pewno możesz mieć params[:description]
(na wszelki wypadek):
<%= form_for @video do |f| %>
...
<%= text_field_tag :description %>
...
Zauważ, że używam tagu text_field_tag
zamiast f.text_field
. W tym przypadku nazwą tagu html będzie description
w params
Hash otrzymasz { "description" => 'Video desc" }
...
Zapoznaj się z dokumentacją Rails API aby zrozumieć różnych pomocników itp., a także przejrzyj dziennik serwera.