2013-05-25 3 views
2

attr_accessible이 기본적으로 사용되지만 railscasts의 # 250에서는 attr_accessor을 사용하므로 혼란 스럽습니다. Authentication from Scratch 튜토리얼에서는모델에서 attr_accessor를 언제 사용하고 attr_accessible을 사용해야합니까?

이 코드는, 사람이 나를 위해 조금 설명 할 수 실제로 상점은 우리의 attr_accessible 및 attr_accessor 일치하지 않는 password_salt을 password_hash하고,

class User < ActiveRecord::Base 
    attr_accessible :email, :password, :password_confirmation 
    attr_accessor :password 
    ... 
end 

그러나 데이터베이스에

입니까?

답변

2

attr_accessible은 질량 지정을 통해 설정할 수있는 모델 속성의 흰색 목록을 지정합니다. (source)

attr_accessor은이 모듈의 이름 지정된 속성을 정의합니다. 이름은 symbol.id2name이며, 인스턴스 변수 (@name)와 해당 액세스 메소드를 작성하여 읽을 수 있습니다. 또한 name =이라는 메서드를 만들어 속성을 설정합니다. (source)

기본적으로 데이터베이스 기반이 아닌 속성이 필요한 경우 attr_accessible을 사용하십시오. db에 의해 지원되는지 여부에 상관없이 속성을 대량 할당해야하는 경우 attr_accessible을 사용하십시오. 데이터베이스가 아닌 attibute를 대량으로 할당해야하는 경우 두 속성을 모두 사용합니다.

이 모든 것이 업데이트 된 질문의 맥락에서 완벽합니다. 마이그레이션에서 password_hash 필드는 db 지원 특성으로 모델에 추가됩니다. 그런 다음 코드에서 password (및 해당 확인)이 데이터베이스가 아닌 데이터베이스의 특성으로 추가됩니다. before_save :encrypt_password 줄은 모델이 저장되기 전에 encrypt_password 메서드를 호출합니다. 이 방법에서 데이터베이스 지원 특성은 데이터베이스가 아닌 특성에서 파생됩니다. attr_accessor :password_hash이 필요하지 않은 이유는 (password과 같은) 질량 할당이 이루어지기보다는 명시 적으로 설정 되었기 때문입니다. 이해가 되니?

+0

업데이트 된 질문보기 그게 내가 실제로 묻고있는거야. – OneZero

+0

수정 내용에 대한 답변을 업데이트했습니다. –

+0

데이터베이스를 기반으로하지 않는 속성에 대한 유형이 있습니까? – OneZero

0

attr_accessor는 가상 속성을
attr_accessible을 만드는 것입니다 튜토리얼
에 따르면 대량 할당

입니다 attr_accessor : 비밀번호
attr_accessible (암호 필드는 데이터베이스에없는 때문에) : 비밀번호 : password_confirmation (때문에 대량의 할당) attr_accessible 이러한를 작성하거나

를 attr_accessor 할 필요가 없도록

password_salt 및 password_hash는 콜백 before_save에

관련 문제