이 스레드와 Google의 많은 사람들이 attr_accessible
대량으로 업데이트 할 수있는 속성의 화이트리스트 ( 동시에 객체 모델의 모든 속성을 동시에 지정) 를 지정하는 것이 매우 잘 설명 되어 있습니다. 이것은 주로 응용 프로그램을 보호하기위한 것입니다. "대량 할당"해적 공격.
이 내용은 공식 Rails 문서에서 설명합니다 : 대량 할당
attr_accessor
클래스에서 setter 및 getter 메소드를 (빠르게) 작성하는 루비 코드입니다. 그게 다야.
이제 설명으로 누락 된 것은 데이터베이스 테이블이있는 (Rails) 모델 사이의 링크를 만들 때 모델에서 절대로 attr_accessor
setter 및 getter를 생성 할 필요가 없다는 것입니다. 테이블의 기록.
모델이 ActiveRecord::Base
클래스의 모든 메소드를 상속하므로 기본 CRUD 액세서 (만들기, 읽기, 업데이트, 삭제)가 이미 정의되어 있기 때문 입니다. 여기는 공식 문서 인 Rails 모델 과 기본 접근 자를 덮어 쓰는 방법에 설명되어 있습니다 ( "기본 접근 자 덮어 쓰기"장으로 스크롤 하십시오 ).
예를 들어, "firstname", "lastname"및 "role"이라는 세 개의 열을 포함하는 "users"라는 데이터베이스 테이블이 있습니다.
SQL 명령어 :
CREATE TABLE users (
firstname string,
lastname string
role string
);
config.active_record.whitelist_attributes = true
대량 할당 악용으로부터 응용 프로그램을 보호하기 위해 config / environment / production.rb에서 옵션을 설정했다고 가정했습니다 . 여기에 설명되어 있습니다 : 대량 할당
Rails 모델은 아래 모델과 완벽하게 호환됩니다.
class User < ActiveRecord::Base
end
그러나 양식의보기가 작동하려면 컨트롤러에서 사용자의 각 속성을 별도로 업데이트해야합니다.
def update
@user = User.find_by_id(params[:id])
@user.firstname = params[:user][:firstname]
@user.lastname = params[:user][:lastname]
if @user.save
# Use of I18 internationalization t method for the flash message
flash[:success] = t('activerecord.successful.messages.updated', :model => User.model_name.human)
end
respond_with(@user)
end
이제 인생을 편하게하기 위해 사용자 모델에 복잡한 컨트롤러를 만들고 싶지 않습니다. 따라서 attr_accessible
클래스 모델에서 특수한 방법을 사용합니다 .
class User < ActiveRecord::Base
attr_accessible :firstname, :lastname
end
따라서 "highway"(대량 할당)를 사용하여 다음을 업데이트 할 수 있습니다.
def update
@user = User.find_by_id(params[:id])
if @user.update_attributes(params[:user])
# Use of I18 internationlization t method for the flash message
flash[:success] = t('activerecord.successful.messages.updated', :model => User.model_name.human)
end
respond_with(@user)
end
"역할"속성을 attr_accessible
목록에 추가 하지 않았습니다. 사용자가 관리자처럼 자신의 역할을 스스로 설정할 수 없기 때문입니다. 다른 특수 관리자보기에서이 작업을 직접 수행하십시오.
사용자보기에는 "역할"필드가 표시되지 않지만 해적은 params 해시에 "역할"을 포함하는 HTTP POST 요청을 쉽게 보낼 수 있습니다. 의 "역할"속성이 누락되면 attr_accessible
응용 프로그램을 보호하는 것입니다.
아래처럼 자체적으로 user.role 속성을 수정할 수 있지만 모든 속성을 함께 사용할 수는 없습니다.
@user.role = DEFAULT_ROLE
도대체 왜 사용 attr_accessor
하겠습니까?
사용자 양식에 users 테이블에 존재하지 않는 필드가 열로 표시되는 경우입니다.
예를 들어, 사용자보기에 "관리자에게 문의하십시오"필드가 표시되어 있다고 가정하십시오. 이 정보를 테이블에 저장하고 싶지 않습니다. Rails가 "crazy";-) 사용자가 구독했다는 경고 이메일을 보내려고합니다.
이 정보를 사용하려면 정보를 임시로 어딘가에 저장해야합니다. user.peekaboo
속성 에서 복구하는 것보다 더 쉬운 방법은 무엇입니까 ?
따라서이 필드를 모델에 추가하십시오.
class User < ActiveRecord::Base
attr_accessible :firstname, :lastname
attr_accessor :peekaboo
end
따라서 user.peekaboo
컨트롤러 어딘가에서 속성을 교육적으로 사용 하여 전자 메일을 보내거나 원하는 작업을 수행 할 수 있습니다.
ActiveRecord는 user.save
모델에서이 이름과 일치하는 열이 표시되지 않으므로 테이블에 "peekaboo"속성을 저장 하지 않습니다.
attr_accessor
getter 및 setter 메소드를 생성하는 데 사용 하는 것이 맞습니다 . 꽤 포괄적 인 설명은 이전의 질문에 대한 내 대답을 참조하십시오attr_accessible
: stackoverflow.com/questions/2652907/...는 그 후 다른 특정 세부 사항을 필요로하는 경우 다음 질문을 업데이트합니다.