Когато използвате 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 за да разберете различни помощници и т.н. И също така прегледайте дневника на вашия сървър.