Rails 4에서`params.require (: person) .permit (: name, : age)`는 무엇입니까?


149

Rails 4 문서의 강력한 매개 변수에 대한 모든 예는

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

누군가가 해체를 기쁘게과 함께 발생하는 것을 설명 할 수 requirepermit여기에?


3
이 예제는 설명서에서 직접 제공 permit하지만 설명 하지는 않습니다 require.
Erik Trautman

답변:


202

params컨트롤러는 해시처럼 보이지만 실제로는의 인스턴스이며 및과 ActionController::Parameters같은 여러 가지 방법을 제공합니다 .requirepermit

require메소드는 특정 매개 변수가 존재하는지 확인하고 제공하지 않으면 require오류를 발생시킵니다. ActionController::Parameters키에 전달 된 인스턴스를 반환합니다 require.

permit메소드는 매개 변수 오브젝트의 사본을 리턴하고 허용 된 키와 값만 리턴합니다. 새 ActiveRecord 모델을 작성할 때 허용 된 속성 만 모델로 전달됩니다.

이전에는 ActiveRecord 모델에 포함 된 화이트리스트와 비슷하지만 컨트롤러에있는 것이 더 합리적입니다.


37
permit에 대한 설명은 약간 벗어납니다. permit은 허용 된 키만 포함하는 다른 해시를 리턴하며이 값 truepermitted?메소드에 응답 합니다 . 기본적으로 인스턴스 ActionController::Parameters클래스는 반환 false에 대한 permitted?응답 truepermitted?매개 변수 개체를 대량 할당에서 사용할 수있는 수단; 그렇지 않으면 앱에서 ForbiddenAttributes 오류가 발생합니다.
sameers

3
연결 permitrequire반환 된 객체에 필요한 매개 변수도 허용하고 포함합니까?
Dennis

require는 허용되는 매개 변수를 만드는 것보다 훨씬 많은 이름을 지정하므로 불행한 이름을 찾습니다. params.permit (: person, : name, : age)를 사용하면 작동하지 않으며 일반적인 형식에 대해 "Unpermitted parameters : : utf8"과 같은 오류가 발생합니다.
Damien

6

예를 들어 더 정확하게 만들려면 를 수행 하는 경우 require로 표시된 해시 .new(...)가 있어야하며 :personperson 해시는 허용으로 만 승인 :name:age표시됩니다.

예:

.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 okay예 는 무엇을 시각화합니까?
p0k8_

@ p0k8_ 나는 그것을 명확히하기 위해 답을 편집했습니다. 이러한 예는 "허용되지 않은"다른 필드 이름을 보여줍니다.
Harry Wood
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.