2011-10-23 2 views
5

여기에 코드입니다 :몽고이 (Mongoid) : 질량 할당으로 정의되지 않은 필드가 생성되는 것을 막는 방법?

class M 
    include Mongoid::Document 
    field :name 
end 

params = { name: "foo", age: 20 } 
M.create(params) 
#=> #<M name: "My Name", age: 20> 

공지 사항 age 것을 정의되지 않은, 아직이 저장되었습니다.

악의적 인 사용자가 몰래 수있는 큰 문자열로 어떤 POST의 매개 변수와 알 수없는 필드를 추가 할 수 있기 때문 (서비스 거부의 잠재적 소스) 문제가있다. (예를 들어 name=foo&bogus=#{'x'*1000000})

지금까지, 나는 할 수 없었다 attr_accessible을 찾으십시오. 그러나 모든 모델에서 항상 fieldattr_accessible에 동일한 필드 이름을 유지해야하므로 Mongoid에는별로 좋지 않습니다. 건조하지 않음.

나는 이기 때문에 attr_accessible API가 ActiveRecord에 유용하다고 생각합니다. 모델 (DRY) 및 필드를 명시 적으로 정의하지 마십시오. b. 존재하지 않는 필드가 RDB에 저장 될 가능성은 없습니다. 그러나 Mongoid에게는 attr_accessible보다 나은 해결책이 있어야한다고 생각합니다.

글로벌 구성 설정이 allow_dynamic_fields이지만 대량 할당에 관한 내용이 아니므로이 설명의 범위를 벗어나지 만 실제로는 모델 별 매크로 여야하며 대량 할당을 처리해야한다고 생각합니다.

어떻게이 문제를 해결하고 있습니까?

+1

해결 방법을 찾으셨습니까 ?? 나는 또한 동일한 문제에 직면하고있다. – Rohit

답변

1

저는 항상 모델에서 attr_accessible을 사용하고 있습니다. 나는 거의 모든 분야를 접근 가능한 것으로 여기는 것을 발견하지 못했다. 대개 질량 할당을 위해 액세스 할 수없는 필드가 항상 있습니다. 자주 모든 속성을 포함해야하고 중복이 염려되는 경우 :

set_callback(:save, :before) do |doc| 
    (doc.attributes.keys - fields.keys).each { |f| doc.unset(f) } 
end 

이 :

나는이 문제를 해결하기 위해 수행 한 어떤
attr_accessible *fields.keys 
0

, 내 모델에 전에 저장 콜백을 사용하는 것입니다 비록 추가 속성이 있더라도 저장되기 전에 제거됩니다.