2012-01-09 1 views
0

대량 할당을 피하기 위해 더 체계적인 솔루션을 갖고 싶습니다.민감한 요소를 매개 변수 해시로 바꾸어 레일에서 질량 할당을 피하십시오.

일반적으로 params (양식을 통해 자동 전송 됨)에서 id 또는 user_id를 제거하고 내부적으로 current_user.id (MyController # create에서)로 바꿉니다.

@user = User.create(:params[:user]) 
@user.update_attributes(:id => current_user.id) 
@user.profile.update_attributes(:user_id => current_user.id) 
@user.preference.update_attributes(:user_id => current_user.id) 

가 짧은/더 건조 방법이 :

내가 생각할 수있는 솔루션은 PARAMS 해시에서 객체를 생성 한 후 (부모와 자식 객체) update_attributes 내부 값에 민감한 속성을 대체하는 것입니다 이것을 말하는가?

선호도, 프로파일 등이 (빌드 메소드를 통해 생성 된) 사용자의 하위 객체 인 경우, 사용자의 외래 키를 찾고 부모에게 전달한 값으로 자동으로 대체하는 메소드를 작성하려면 어떻게해야합니까?

감사합니다.

답변

1

이것은 attr_protectedattr_accessible (documentation)입니다. attr_protected은 차단 목록 보호를 제공하고 attr_accessible은 허용 목록을 사용하여 보호합니다.

대량 할당 직후 update_attributes을 호출하는 동안 모델에 매스 작업을 할 때마다 코드 중복이 필요하지 않으므로 대량 할당을 보호하는 방법을 사용하는 것이 좋습니다.

+0

감사합니다. Zachary. attr_accessible로하려는 일을 어떻게 처리하는지 자세히 설명해 주시겠습니까? 나는 attr_protected 등을 알고 있지만 DRY 방식으로 보호 된 속성을 할당하는 방법을 모르겠습니다. – AdamNYC

+0

그것은'attr_protected'와 같은 방식으로 작동하지만 블랙리스트 대신 화이트리스트입니다. 따라서'name','email','password'라는 이름의 속성을 가지고 있다면'attr_accessible : name, : email, : password'를 실행하면 그 3 가지 속성 만 매쓰 할 수 있습니다. –

+0

죄송합니다,하지만 내 질문은 실제로 컨트롤러에서 이러한 보호 된 특성을 처리하는 방법입니다. – AdamNYC

1

내가 사용하여 이전 프로젝트에서이 일을했습니다

@user = User.create(params[:user]) do |user| 
    user.id = current_user.id 
end 

을겠습니까 당신을 위해이 일?

다른 방법은 docs을 확인하고 역할 기반 속성에 대해 :as을 검색하는 것입니다.

+0

감사합니다. Lasse. 그것은 효과가있을 것이다. 그러나 그것은 나에게 아직도 임시 변통이 다. 또한 user_id를 current_user.id로 바꾸기 위해 모든 하위 개체를 검사하려고합니다. – AdamNYC

관련 문제