`Params.require (: person) .permit (: name ,: age)` đang làm gì trong Rails 4?


149

Tất cả các ví dụ về tham số mạnh trong tài liệu Rails 4 sử dụng

params.require(:person).permit(:name, :age)

Ai đó có thể vui lòng giải mã và giải thích những gì đang xảy ra với requirepermitở đây?


3
Ví dụ này xuất phát trực tiếp từ tài liệu, giải thích permitnhưng không require.
Erik Trautman

Câu trả lời:


202

Bộ paramsđiều khiển trông giống như Hash, nhưng thực tế nó là một thể hiện của ActionController::Parameters, nó cung cấp một số phương thức như requirepermit.

Các requireĐảm bảo phương pháp mà một tham số cụ thể là hiện tại, và nếu nó không được cung cấp, các requirephương pháp ném một lỗi. Nó trả về một thể hiện của ActionController::Parameterskhóa được truyền vào require.

Các permitphương thức trả về một bản sao của đối tượng thông số, chỉ trả lại chìa khóa và các giá trị cho phép. Khi tạo một mô hình ActiveRecord mới, chỉ các thuộc tính được phép được truyền vào mô hình.

Nó trông rất giống với danh sách trắng trước đây được bao gồm trong các mô hình ActiveRecord, nhưng nó có ý nghĩa hơn khi nó nằm trong bộ điều khiển.


37
Các mô tả của giấy phép là một chút off: giấy phép trả khác băm mà chỉ chứa các phép chủ chốt VÀ (điều này là rất quan trọng) sẽ phản ứng với truevới permitted?phương pháp. Theo mặc định, một thể hiện của ActionController::Parameterslớp sẽ trở lại falsecho permitted?Hưởng ứng trueđể permitted?phương tiện các đối tượng tham số có thể được sử dụng trong phân khối; nếu không, ứng dụng sẽ xuất hiện lỗi ForbiddenAttribut.
cùng

3
Có xích permittrên requirecũng cho phép và bao gồm các tham số cần thiết trong đối tượng trả lại?
Dennis

Tôi thấy việc đặt tên không may, vì yêu cầu thực hiện nhiều hơn so với yêu cầu tham số được phép. Sử dụng params.permit (: person ,: name ,: age) không hoạt động và tạo ra các lỗi như "Tham số chưa được gửi :: utf8" cho một hình thức điển hình.
Damien

6

Nói chính xác hơn, khi bạn tạo ví dụ. làm .new(...), phải có :personbăm được chỉ định bởi yêu cầu và người băm sẽ chỉ chấp nhận :namevà được :agechỉ định bởi giấy phép.

Thí dụ:

.new(person: { name: "Bhojendra", age: 32 }) // okay
.new(person: { name: "Rauniyar" }) // okay
.new(person: { name: "Bhojendra", other: 'asdf' }) // not okay, other not permitted
.new(person: { full_name: "Bhojendra Rauniyar" }) // not okay, full_name not permitted
.new(detail: { name: "Bhojendra", age: 32 }) // not okay, must be person

not okayVí dụ thứ 3 và thứ 4 hình dung ra sao?
p0k8_

@ p0k8_ Tôi đã chỉnh sửa câu trả lời để làm rõ điều đó. Những ví dụ này cho thấy một số tên trường khác nhau không được "cho phép".
Harry Wood
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.