Rails 4-강력한 매개 변수-중첩 된 객체


144

꽤 간단한 질문이 있습니다. 그러나 지금까지 해결책을 찾지 못했습니다.

서버에 보내는 JSON 문자열은 다음과 같습니다.

{
  "name" : "abc",
  "groundtruth" : {
    "type" : "Point",
    "coordinates" : [ 2.4, 6 ]
  }
}

새로운 허가 방법을 사용하여 다음을 얻었습니다.

params.require(:measurement).permit(:name, :groundtruth)

이로 인해 오류가 발생하지 않지만 작성된 데이터베이스 항목에는 null기본 값 대신 포함 됩니다.

방금 설정 한 경우 :

params.require(:measurement).permit!

모든 것이 예상대로 저장되지만 당연히 강력한 매개 변수로 제공되는 보안이 중단됩니다.

배열을 허용하는 방법을 찾았지만 중첩 된 객체를 사용하는 단일 예제는 없습니다. 꽤 일반적인 사용 사례이기 때문에 어쨌든 가능해야합니다. 어떻게 작동합니까?



1
@vinodadhikary 맞습니다… OP가 혼란 스러워요. 중첩 속성을 허용 할 때 들리는 것처럼 이상하게도 배열 내에서 중첩 객체의 속성을 지정합니다. 반면에 여러 객체를 중첩하려면 해시 안에 래핑합니다. api.rubyonrails.org/classes/ActionController/…github.com/rails/rails/blob/master/actionpack/lib/…
j03w

@ j03w, 소스에 연결해 주셔서 감사합니다. 지금은 분명하다. 이 결과가 다른 많은 사람들에게 도움이 될 것으로 생각되므로 여기에 답을 추가해야합니다.
vee

답변:


181

중첩 속성을 허용 할 때 들리는 것처럼 이상하게도 배열 내에서 중첩 객체의 속성을 지정합니다. 귀하의 경우에는

@RafaelOliveira가 제안한대로 업데이트

params.require(:measurement)
      .permit(:name, :groundtruth => [:type, :coordinates => []])

반면에 여러 객체를 중첩하려면 해시 안에 래핑합니다.

params.require(:foo).permit(:bar, {:baz => [:x, :y]})


레일즈는 실제로 이것에 대해 꽤 좋은 문서를 가지고 있습니다 : http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit

자세한 설명을 위해 https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247 의 구현 permitstrong_parameters자체를 살펴볼 수 있습니다.


5
이 답변에서 두 경우 모두 동일합니다. 실제로는 중괄호가 {: groundtruth => [...]} 주위에서 선택 사항입니다. 해시이지만 인터프리터는 명시적인 중괄호없이 해시가 시작되고 끝나는 위치를 결정할 수 있습니다.
speakingcode

중첩 된 속성 배열은 중첩 된 속성을 허용하지 않습니다. 중첩 된 속성 및 attr_accessor가 내 응용 프로그램에서 "허용되지 않은 매개 변수"로 나열됩니다. 안전한 솔루션을 찾고 있습니다.
Katarzyna

중첩 된 객체가 여러 개인 경우이 ID가 작동하도록 허용해야합니다. 여기에 더 많은 정보 : stackoverflow.com/questions/18308714/...
파브리스 Carrega

1
이것은 하나의 중첩 속성 세트 만 허용합니다. 일대 다의 경우에는 작동하지 않습니다.
AKWF

23

이 제안이 내 경우에 유용하다는 것을 알았습니다.

  def product_params
    params.require(:product).permit(:name).tap do |whitelisted|
      whitelisted[:data] = params[:product][:data]
    end
  end

github에 대한 Xavier의 의견 링크 를 확인하십시오 .

이 접근법은 전체 params [: measurement] [: groundtruth] 객체를 허용합니다.

원래 질문 속성 사용 :

  def product_params
    params.require(:measurement).permit(:name, :groundtruth).tap do |whitelisted|
      whitelisted[:groundtruth] = params[:measurement][:groundtruth]
    end
  end

4
참고로, 이것은 여전히 ​​허용되지 않은 매개 변수로 로그에 표시되지만 모델은 어쨌든 허용합니다.
Weston Ganger

5
Rails 4는 확실하지 않지만 Rails 5 프로젝트 permit!에서는 화이트리스트 로 전화 를 걸어야합니다. 그렇지 않으면 탭한 후에도 허용되지 않습니다. 이 경우params[:measurement][:groundtruth].permit!
nayiaw

@nayiaw 나는 또한 허용 되지 않은 메시지를 얻지 만 추가 permit!하면이 오류 NoMethodError (undefined method 허가 가 발생 합니다! ' for # <Array : 0x007f80cb71ea00>) :`
wuliwong

@wuliwong permit!방법은 사용할 수 없습니다 Array. 액세스하려면 해당 클래스 인스턴스에 액세스해야합니다 permit!(시간이 지났으므로 클래스 이름을 잊어 버렸지 만이 페이지를ActionController::Parameters 기반으로 한 것과 같습니다 ).
nayiaw

8

중첩 된 객체 허용 :

params.permit( {:school => [:id , :name]}, 
               {:student => [:id, 
                            :name, 
                            :address, 
                            :city]},
                {:records => [:marks, :subject]})

0

Rails 5 인 경우 새로운 해시 표기법으로 인해 params.permit(:name, groundtruth: [:type, coordinates:[]])제대로 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.