Когато използвате form_for
:
Във вашия случай, Video
модел. За да разберете конвенцията на Rails:
<%= form_for @video do |f| %>
...
<%= f.text_field :description %>
...
Което води до html таг, чийто атрибут на име е video[description] . Това означава, че когато формулярът бъде изпратен, въведената от потребителя стойност ще бъде налична в контролера като params[:video][:description] .
params
променливата е инстанция на ActiveSupport::HashWithIndifferentAccess
, като Hash
с малка разлика, според документацията:
Вашите params
е нещо като:
{"utf8"=>"✓",
"_method"=>"post",
"authenticity_token"=>"xxx",
"video"=>
{"description"=>"Video desc"}
}
Където е "video"
или :video
е един от ключовете на Hash. И така, params[:video]
е еквивалентен на params.fetch("video")
чиято стойност е {"description"=>"Video desc"}
. Както можете да видите, стойността е друг хеш. Накрая, за да получите стойността на описанието, трябва да params[:video][:description]
(Начинът на Rails) или params.fetch("video").fetch("description")
, чиято стойност е "Video desc"
.
fetch
е Ruby метод на Hash
:"Връща стойност от хеша за даден ключ."
Като се има предвид това:
Video.new(params[:video]) = Video.new(:description => "Video desc") = Video.new(:description => params[:video][:description])
По-лесно е да използвате конвенции, но със сигурност можете да имате params[:description]
(за всеки случай):
<%= form_for @video do |f| %>
...
<%= text_field_tag :description %>
...
Имайте предвид, че използвам text_field_tag
вместо f.text_field
. В този случай името на html тага ще бъде description
в params
Хеш ще получите { "description" => 'Video desc" }
...
Разгледайте документацията за Rails API за да разберете различни помощници и т.н. И също така прегледайте дневника на вашия сървър.