2014-06-09 2 views
2

내가 모델 기능 레일 응용 프로그램 구현 해요 :레일 유효하지 않은 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 오류이 제거되어 결과적으로 '분류 카테고리를 비워 둘 수 없습니다'라는 검증 된 오류가 발생합니다. 그러나 유효성 검증이 완료되면 문제점은 지속됩니다.

+0

ActiveRecord의 실제 버그. –

답변

0

난 당신이 대신 association_idassociation를 사용하려고하면 검증이 어떻게 작동하는지, 잘 모르겠지만, 당신은 Categorisation 모델에서 유효성 검사에 validates_each 대신 validates_presence_of를 사용하려고 할 수 있습니다 : 이것은처럼 보이는

validates_each :category_id do |record, attr, value| 
    unless Category.exists?(id: value) 
    record.errors.add(attr, "does not exist") 
    end 
end 
+0

답장을 보내 주셔서 감사합니다. 불행히도 나는 이전과 같은 행동을하고 있습니다. (덧붙여 말하면, 이것은 중첩 된 속성을 사용하여 _create_ 카테고리를 활용할 때 문제가 될 수 있습니다.) – biril

+0

모든 스택 추적을 추가 할 수 있습니까? 어쩌면 우리는 뭔가를 찾을 수있을 것입니다. – edariedl

+0

물론 편집 된 질문을 참조하십시오. 나는 document.valid?의 경우 스택 추적을 추가했다. – biril

관련 문제