2015-11-28 14 views
21

Tài liệu về phương pháp Phoenix scrub_params không rõ ràng đối với tôi. Dường như chức năng này tương tự như tính năng thông số mạnh của Rails. Tuy nhiên, khi bạn sử dụng nó trong bộ điều khiển như vậy,Phương pháp chà sàn của Phoenix có phải là thông số mạnh của Rails không?

plug :scrub_params, "user" when action in [:create] 

... bạn không nêu rõ thông số nào bạn muốn đưa vào danh sách cho phép. Tôi đã xem xét mã số cho scrub_params, nhưng tôi đủ noobish với Elixir rằng tôi không hoàn toàn chắc chắn những gì đang xảy ra.

Phương pháp này chỉ xem xét mô hình và sử dụng các thuộc tính mô-đun trường bắt buộc và tùy chọn cho các tham số trong danh sách trắng?

Ngoài ra, tài liệu scrub_params cho biết "Kiểm tra xem liệu require_key có tồn tại" hay không. "Khóa bắt buộc" là gì? Đó có phải chỉ là các trường bắt buộc từ mô hình không?

Trả lời

35

Chức năng scrub_params/2 không thực sự giống như thông số mạnh của Rails. Trong Ecto bạn xác định khóa được phép trong hàm changeset của bạn bằng cách sử dụng Ecto.Changeset.cast/4.

thông số Scrub nào sau đây:

  • Đảm bảo chìa khóa cần thiết tồn tại.
  • Thay đổi giá trị rỗng từ bản đồ trong params với phím cần thiết để nil

Ví dụ, gọi:

plug scrub_params "user" 

sẽ kiểm tra sự hiện diện của một "người sử dụng" chìa khóa. Từ the docs:

Nếu require_key không có mặt, nó sẽ tăng Phoenix.MissingParamError.

Nếu bạn có một bản đồ params trông giống như:

%{"user" => %{"name" => "foo", "age" => ""}} 

Sau đó, "tuổi" tham số sẽ được chuyển đổi sang nil. Điều này cho phép bạn gọi hàm changeset của bạn trực tiếp với params:

def create(conn, %{"user" => user_params}) do 
    User.changeset(user_params) 
end 

Các scrub_params/2 là hoàn toàn không liên quan đến mô hình của bạn, nó chỉ hoạt động tốt với Ecto kể từ khi Ecto.Changeset.cast/4 hàm lấy một tập hợp các trường bắt buộc và một tập hợp các tùy chọn lĩnh vực. Chuyển nil đến trường bắt buộc sẽ làm mất hiệu lực của changeset và thêm lỗi cho trường này.

+0

Cảm ơn bạn đã làm rõ. Điều đó có ý nghĩa. –

+0

Vì vậy, những gì tương đương với params mạnh ở Phoenix? Tôi cần hạn chế đầu vào của người dùng. Đánh giá cao câu trả lời [cho câu hỏi của tôi ở đây.] (Http://stackoverflow.com/questions/39938824/elixir-phoenix-restrict-params-like-rails-strong-params) Cảm ơn. –

Các vấn đề liên quan