내가 모델 기능 레일 응용 프로그램 구현 해요 :레일 유효하지 않은 ID 전무에 대한 '정의되지 않은 방법은'속성 'NilClass'
class Document < ActiveRecord::Base
has_many :categorisations
has_many :categories, through: :categorisations
accepts_nested_attributes_for :categorisations
end
class Category < ActiveRecord::Base
has_many :categorisations
has_many :documents, through: :categorisations
end
class Categorisation < ActiveRecord::Base
belongs_to :document
belongs_to :category
validates_presence_of :document
validates_presence_of :category
validates_uniqueness_of :category, scope: :document
end
가
Document
에서 accepts_nested_attributes_for
의 존재가 범주를 부착 할 수 있습니다를 문서 작성시 문서. 잘못된 category-id (범주가없는 category-id)가 중첩 된 속성을 통해 전달되는 경우를 제외하면 일반적으로 잘 작동합니다. 이 경우 : document.save
할 때 당연히
document = Document.new({
# .. attributes ..,
categorisations_attributes: {
'0' => {
# .. more attributes ..,
category_id: some_invalid_id
}
}
})
# Ouch, this results in 'NoMethodError: undefined method `attributes' for nil:NilClass'
document.valid?
, 저도 같은 오류가 발생합니다. 이제는 document.categorisations.first.category.nil?
과 같은 것을 검사하여이를 탐지하고 선점 할 수있는 것처럼 보입니다. 이것은 평범한 Rails 유효성 검사와 일치하지 않으며 document.save
(false
반환 값을 통해)에서 무효를 감지하는 일반적인 패턴을 따르지 못하기 때문에 이상적인 것보다 덜하다.
일부 Rails의 우수 사례가 누락되었거나이를 완화 할 수있는 모델을 배치하는 더 나은 방법이 있습니까?
:
activerecord-4.0.2/lib/active_record/validations/uniqueness.rb:56:in `build_relation'
activerecord-4.0.2/lib/active_record/validations/uniqueness.rb:22:in `validate_each'
activemodel-4.0.2/lib/active_model/validator.rb:153:in `block in validate'
activemodel-4.0.2/lib/active_model/validator.rb:150:in `each'
activemodel-4.0.2/lib/active_model/validator.rb:150:in `validate'
activesupport-4.0.2/lib/active_support/callbacks.rb:283:in `_callback_before_29'
activesupport-4.0.2/lib/active_support/callbacks.rb:407:in `_run__1039810079386051889__validate__callbacks'
activesupport-4.0.2/lib/active_support/callbacks.rb:80:in `run_callbacks'
activemodel-4.0.2/lib/active_model/validations.rb:373:in `run_validations!'
activemodel-4.0.2/lib/active_model/validations/callbacks.rb:106:in `block in run_validations!'
activesupport-4.0.2/lib/active_support/callbacks.rb:373:in `_run__1039810079386051889__validation__callbacks'
activesupport-4.0.2/lib/active_support/callbacks.rb:80:in `run_callbacks'
activemodel-4.0.2/lib/active_model/validations/callbacks.rb:106:in `run_validations!'
activemodel-4.0.2/lib/active_model/validations.rb:314:in `valid?'
activerecord-4.0.2/lib/active_record/validations.rb:70:in `valid?'
activerecord-4.0.2/lib/active_record/autosave_association.rb:304:in `association_valid?'
activerecord-4.0.2/lib/active_record/autosave_association.rb:293:in `block in validate_collection_association'
activerecord-4.0.2/lib/active_record/autosave_association.rb:293:in `each'
activerecord-4.0.2/lib/active_record/autosave_association.rb:293:in `validate_collection_association'
activerecord-4.0.2/lib/active_record/autosave_association.rb:207:in `block in add_autosave_association_callbacks'
activerecord-4.0.2/lib/active_record/autosave_association.rb:153:in `instance_eval'
activerecord-4.0.2/lib/active_record/autosave_association.rb:153:in `block in define_non_cyclic_method'
activesupport-4.0.2/lib/active_support/callbacks.rb:397:in `_run__779968926416857275__validate__callbacks'
activesupport-4.0.2/lib/active_support/callbacks.rb:80:in `run_callbacks'
activemodel-4.0.2/lib/active_model/validations.rb:373:in `run_validations!'
activemodel-4.0.2/lib/active_model/validations/callbacks.rb:106:in `block in run_validations!'
activesupport-4.0.2/lib/active_support/callbacks.rb:383:in `_run__779968926416857275__validation__callbacks'
activesupport-4.0.2/lib/active_support/callbacks.rb:80:in `run_callbacks'
activemodel-4.0.2/lib/active_model/validations/callbacks.rb:106:in `run_validations!'
activemodel-4.0.2/lib/active_model/validations.rb:314:in `valid?'
activerecord-4.0.2/lib/active_record/validations.rb:70:in `valid?'
[편집 여기 document.valid?
의 경우에 대한 스택 추적입니다] [편집 2 :]
은 내가 Categorisation
모델의 validates_uniqueness_of :category, scope: :document
제약 조건을 포함하는 질문을 갱신 . 제거하면 NIL 오류이 제거되어 결과적으로 '분류 카테고리를 비워 둘 수 없습니다'라는 검증 된 오류가 발생합니다. 그러나 유효성 검증이 완료되면 문제점은 지속됩니다.
ActiveRecord의 실제 버그. –