Hãy nói về Rails parameters! Tại sao hữu ích? User gửi data đến web app ba cách khác nhau. Ba cách:
- Query parameter (
"example.com/?q=bacon") - Submit form (
"/users/sign_in") - Trong chính URL (
"/books/1")
Làm sao truy cập data từ Rails? Với params. Bên trong controller action gọi params để truy cập form & URL query data. params là gì? Method trả về object ActionController::Parameters, thực tế hành xử như hash. Muốn đọc một giá trị từ hash params: Cách: params[:id]. Nhận giá trị nếu tồn tại. Hoặc nil nếu không. Vài điều biết: Field để trống nhận empty string. Tất cả giá trị trong params là string. Dù submit dạng integer. Hãy xem sâu Rails params vì nếu không hiểu tốt chúng gây nhầm lẫn & vấn đề kỳ lạ!
Quy Ước Rails: Form Field & Params
Form field & URL parameter map tới key params như thế nào? Có ví dụ. Đây:
Form search đơn giản gửi POST đến
/search. Kết quả params object: { "q"=>"", "controller"=>"books", "action"=>"search" } "q" là gì? Thuộc tính name của input field trong HTML form. Name có thể bất kỳ. Nếu tạo form dùng helper form_for, name auto-generated & tuân theo pattern. Ví dụ: # form_for(@book) với vài field generate như nàyFormat
book[title] trong field name tạo params hash lồng nhau. Giải thích ví dụ:
{ "book"=> { "title"=>"", "author"=>"", "cover"=>"", "language"=>"English" } }
User submit form trắng & nhận được này. Từ controller... Truy cập data:
params[:book][:language] # "English" params[:book][:author] # ""
Nhớ behavior như hash, nhưng khác hash thường, chấp nhận cả symbol & string như key tương đương. Nghĩa là params["book"] & params[:book] giống nhau.
Cho Phép Route Nhận Parameter
Ngoài query param, cũng enable REST-style param. Rails gọi "dynamic segment". Xem ví dụ. Nếu route:
get 'books/:id', to: 'books#show'
Hoặc: resources :books. URL như:
/books/1Truy cập
1 là id trong books/:id. Với params. Như: params[:id]. Giúp tìm resource cụ thể user muốn. Book.find(params[:id]).
Hiểu Strong Params
Tiếp: Thử save object DB, nhưng không work. Xem rails server log. Có thể thấy:
Unpermitted parameter: :languageÝ nghĩa? Rails giới thiệu "strong parameters" từ Rails 4 như security feature. Buộc whitelist attribute có thể save. Ngăn "mass assignment", cho user độc hại set
admin = true, hoặc set field khác bình thường không truy cập. Whitelist field:
def book_params params.require(:book).permit(:title, :author, :cover, :language) end
Cách hoạt động: require tìm params[:book] & raise error nếu không có. permit list attribute cho phép (nhưng optional). Kết quả: hash params mới với attribute này, giờ clear để save DB. Ví dụ: Book.create(book_params). Chú ý hash Ruby thường bypass hệ thống security này. Ví dụ: Book.create(title: "", author: "", cover: "") OK nếu attribute name (như author) hardcoded.
Tóm Tắt
Bạn đã học Rails parameters, cách hoạt động & dùng đúng trong project Rails! Bây giờ lượt bạn practice, note, review 🙂 Cảm ơn bạn đã đọc.