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.