Khi bạn đang sử dụng form_for :
Trong trường hợp của bạn, Video người mẫu. Để hiểu quy ước Rails:
<%= form_for @video do |f| %>
...
<%= f.text_field :description %>
...
Điều này dẫn đến thẻ html có thuộc tính tên là video [description] . Điều này có nghĩa là khi biểu mẫu được gửi, giá trị do người dùng nhập sẽ có sẵn trong bộ điều khiển dưới dạng params [:video] [:description] .
params biến là một phiên bản của ActiveSupport::HashWithIndifferentAccess , giống như một Hash với một sự khác biệt nhỏ, theo tài liệu:
params của bạn là một cái gì đó giống như:
{"utf8"=>"✓",
"_method"=>"post",
"authenticity_token"=>"xxx",
"video"=>
{"description"=>"Video desc"}
}
Ở đâu "video" hoặc :video là một trong những chìa khóa của Hash. Vì vậy, params[:video] tương đương với params.fetch("video") giá trị nào là {"description"=>"Video desc"} . Như bạn có thể thấy giá trị là một Hash khác. Cuối cùng để nhận được giá trị của mô tả, bạn phải params[:video][:description] (The Rails way) hoặc params.fetch("video").fetch("description") , giá trị nào là "Video desc" .
fetch là một phương thức Ruby của Hash :"Trả về giá trị từ hàm băm cho khóa đã cho."
Tính đến điều này:
Video.new(params[:video]) = Video.new(:description => "Video desc") = Video.new(:description => params[:video][:description])
Việc sử dụng các quy ước sẽ dễ dàng hơn, nhưng chắc chắn rằng bạn có thể có params[:description] (đề phòng):
<%= form_for @video do |f| %>
...
<%= text_field_tag :description %>
...
Lưu ý rằng tôi đang sử dụng text_field_tag thay vì f.text_field . Trong trường hợp này, tên thẻ html sẽ là description trong params Băm, bạn sẽ nhận được { "description" => 'Video desc" } ...
Hãy xem tài liệu API Rails để hiểu những người trợ giúp khác nhau, v.v. Và cũng có thể xem lại nhật ký máy chủ của bạn.