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


149

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

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

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


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

답변:


202

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

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

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

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


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

3
연결 permit시 require반환 된 객체에 필요한 매개 변수도 허용하고 포함합니까?
— 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.