2009-06-04 2 views
3

레일에 attr_accessible을 사용하는 것에 관한 질문이 있습니다.레일 - attr_accessible 및 질량 지정

때때로 대량 할당 보호를 우회하기 위해 guard_protected_attributes에서 false으로 설정하려고합니다.

@user.attributes=({ :name => "James Bond", :admin => true }, false) 

...하지만이 작업을 수행합니다 : 다음 행이 작동하지 않는 이유는 (그것이 "키를 캐릭터 라인 화 수 없습니다"오류를 생성합니다) 궁금하네요

@user.send(:attributes=, { :name => "James Bond", :admin => true }, false) 

누구나가 알고 이유?

답변

6

Ruby 파서가 #attributes=에 대한 인수로 '{ :name => "James Bond", :admin => true}, false'을 구문 분석하기 때문에. 메소드 'foo='을 호출하면 Ruby에서 하나의 인수로 제한됩니다. send가 그 주위에 있습니다.

레일즈가 의 키를 문자열로 변환하려고 시도하고 있는데 FalseClassHash이 아닌 문자열에 어떤 문자도없는 것입니다.

+0

고마워요, 이것이 나를 미치게했습니다! – fig

+0

나는 실제로 IRB에서 몇 가지 테스트를 실시했다. 단일 인수는 Array이며 키의 문자열을 지정할 수 없습니다. –

+1

한 번 배열 배열을보고 싶습니다. – fig

1

여러분이이 작업을 수행하는지 확인하고 싶습니다. 따라서 .send 또는 더 나은 접근 방법이 필요합니다.

1

질량 할당 제한을 약간 더 쉽게 우회 할 수 있도록 몇 가지 도우미 방법을 정의했습니다.

module ActiveRecord 
    class Base 

    # Assigns attributes while ignoring mass assignment protection 
    def force_feed(attributes) 
     self.send(:attributes=, attributes, false) 
     self 
    end 

    end 
end 
1

이후 버전의 ActiveRecord에서는 attributes에 대한 두 번째 매개 변수가 제거되었습니다. 같은 효과로 통화 할 수 있습니다.

model.assign_attributes(attributes, :without_protection => true) 
관련 문제