복붙노트

[RUBY-ON-RAILS] "경고 : 수 대량 할당하지 보호 속성"

RUBY-ON-RAILS

"경고 : 수 대량 할당하지 보호 속성"

나는 (사실, 나도 이유를 수행 고안 보석을 사용하고 있습니다) 모델을 생성하기 위해 편안하고 기술을 사용하고, 나는 모델에 FIRST_NAME과 LAST_NAME라는 새 필드를 추가했습니다. 마이그레이션 벌금을했다. 모델에 LAST_NAME을하고 그냥 일을 것이라고 예상 : FIRST_NAME : 나는 attr_accessor를 추가했다. 내가 Doctor.create ({: FIRST_NAME => "MyName로"})와 대량 할당 새로운 인스턴스를 시도 할 때 말하는 등, 내가 점점 오전 오류가 난 못해 대량 할당 보호 속성 수 있습니다.

나는 attr_accessor를 사용하는 전적인 이유는 모델의 필드의 protectedness를 해결하기 위해 생각했다. 날이 메시지의 의미를 도와 드릴까요?

편집 : 아, 그리고 방법에 의해 레코드가 하나 생성되지 않습니다. 나는이 그냥 경고이기 때문에 그들이해야한다 생각하지만, 데이터베이스에 없습니다.

EDIT2 : 여기에 내 모델입니다

class Doctor < User
  has_many :patients
  has_many :prescriptions, :through=> :patients

  validates_presence_of :invitations, :on => :create, :message => "can't be blank"

  attr_accessor :invitations
end

그들이 의사의 조상 인 사용자 테이블에서 생성되기 때문에 FIRST_NAME과 LAST_NAME이없는 스키마. 나는 하나의 테이블 상속을 사용했다.

create_table :doctors do |t|
  t.integer :invitations

  t.timestamps
end

이것은 사용자 테이블을 변경할 수있는 마이그레이션입니다

add_column :users, :first_name, :string
add_column :users, :last_name, :string
add_column :users, :type, :string

편집 : 여기에 시드 파일입니다. 나는 truncate_db_table 방법을 포함하고 있지 않다, 그러나 그것은 작동합니다.

%w{doctors patients}.each do |m|
  truncate_db_table(m)  
end  

Doctor.create(:invitations=>5, :email=>"email@gmail.com", :first_name=>"Name", :last_name=>"LastName")
Patient.create(:doctor_id=>1, :gender=>"male", :date_of_birth=>"1991-02-24")

해결법

  1. ==============================

    1.attr_accessible하지 혼동 attr_accessor를 수행합니다. 접근은 루비에 내장 getter 메소드를 정의한다 - model_instance.foo 번호를 반환 뭔가를 - 그리고 setter 메소드 - model_instance.foo = '바'.

    attr_accessible하지 혼동 attr_accessor를 수행합니다. 접근은 루비에 내장 getter 메소드를 정의한다 - model_instance.foo 번호를 반환 뭔가를 - 그리고 setter 메소드 - model_instance.foo = '바'.

    액세스는 레일에 의해 정의되고 (attr_protected의 반대 않음) 속성 대량 할당하게된다.

    FIRST_NAME이 모델의 데이터베이스 테이블의 필드의 경우, 레일은 이미 속성에 대한 getter와 setter를 정의하고있다. FIRST_NAME : 당신이해야 할 모든 attr_accessible를 추가합니다.

  2. ==============================

    2.생산 모드에 전혀 맞지 안전하지 않은 방식으로 앱 함께 해킹하려면 :

    생산 모드에 전혀 맞지 안전하지 않은 방식으로 앱 함께 해킹하려면 :

    당신이 찾아 볼 수있는 곳 끝으로 스크롤을 아래로 /config/application.rb로 이동

    {config.active_record.whitelist_attributes = true}
    

    false로 설정합니다.

    EDIT / BTW (11 주 워크샵을 포함 루비 집약적 인 작업을 4 개월 만) : DHH가 믿고, noobies (그의 말) "및 실행"를 "매우 안전"보다 더 중요하다.

    통보 : A는 경험이 풍부한 레일의 많은 개발자들이 매우 열정적에 대한 당신이이 일을하고 싶지 않다 생각합니다.

    최신 정보: 삼년 후,이 작업을 수행하는 또 다른 방법은 - 당신은 각 모델을 위해 그것을하기 때문에 다시, 아마 위의 솔루션보다 더 나은 보안,하지만

    class ModelName < ActiveRecord::Base
      column_names.each do |col|
        attr_accessible col.to_sym
      end
      ...
    end
    
  3. ==============================

    3.여기 attr_accessor 사용하지 마십시오. 액티브 모델에 자동으로 사람을 만듭니다. 검증 또는 대량 할당 오류가 발생하는 경우 또한, 액티브는 레코드를 생성하지 않습니다.

    여기 attr_accessor 사용하지 마십시오. 액티브 모델에 자동으로 사람을 만듭니다. 검증 또는 대량 할당 오류가 발생하는 경우 또한, 액티브는 레코드를 생성하지 않습니다.

    편집 : 당신은 의사 테이블이 필요하지 않습니다, 당신은 레일 단일 테이블 상속을 처리하는 유형의 열이있는 사용자 테이블이 필요합니다. 초대장은 사용자 테이블에있을 것입니다. 아, 난 당신이 사용자에 대한 유형이 어떻게 당신의 추가 코드 샘플을 참조하십시오. 사용자에게 이상, 의사 테이블의 이동 초대를 제거하고 난 당신이 확인해야한다고 생각하기. 또한 attr_accessor 제거. 필요하지 않습니다.

    STI는 특정 모델의 모든 클래스와 서브 클래스가 같은 테이블을 사용 레일 명심하십시오. 의사의 기록은 모두 '의사'의 형태로 사용자 테이블에서 행이 될 것입니다

    편집 : 또한, 당신은 당신이 유일한 창조에 초대하지 업데이트의 유효성을 존재하겠습니까?

  4. ==============================

    4.테이블 경로 파일에 변수 1, 변수 2 : attr_accessible를 추가합니다.

    테이블 경로 파일에 변수 1, 변수 2 : attr_accessible를 추가합니다.

  5. ==============================

    5.@Robert Speicher의 대답에 동의하지만, 난 강력하게 당신은 질량 asignment로부터 보호하기 위해 attr_accessible 대신 강력한 매개 변수를 사용하는 것을 권장합니다.

    @Robert Speicher의 대답에 동의하지만, 난 강력하게 당신은 질량 asignment로부터 보호하기 위해 attr_accessible 대신 강력한 매개 변수를 사용하는 것을 권장합니다.

    건배!

  6. ==============================

    6.개별 통화 (그러나 전 세계적으로)에 대한 해제 대량 할당 보호하려면 : without_protection는 => 진정한 옵션을 사용할 수 있습니다. 키가 / 해시 값은 하드 코딩하거나 안전한 것으로 알려져 있습니다 어디 마이그레이션 및 기타 장소에 대한이 유용한를 찾을 수 있습니다.

    개별 통화 (그러나 전 세계적으로)에 대한 해제 대량 할당 보호하려면 : without_protection는 => 진정한 옵션을 사용할 수 있습니다. 키가 / 해시 값은 하드 코딩하거나 안전한 것으로 알려져 있습니다 어디 마이그레이션 및 기타 장소에 대한이 유용한를 찾을 수 있습니다.

    여기에 예 (레일에서 작동 3.2도) : https://apidock.com/rails/v3.1.0/ActiveRecord/Base/create/class

  7. from https://stackoverflow.com/questions/3944288/warning-cant-mass-assign-protected-attributes by cc-by-sa and MIT license