4

Rails 모델에 대한 특성이 중첩되어 있으며 어떤 이유로 연결 유효성 검사가 실패합니다. 나는 accepts_nested_attributes_for를 사용하지 않지만, 비슷한 것을하고 있습니다.Rails 중첩 된 특성 연결 유효성 검사 실패

class Project < ActiveRecord::Base 
    has_many :project_attributes 

    def name 
    project_attributes.find_by_name("name") 
    end 

    def name=(val) 
    attribute = project_attributes.find_by_name("name") 

    if attribute 
     attribute.value = val 
    else 
     project_attributes.build(:name=>"name", :value=>val) 
    end 
    end 
end 

class ProjectAttribute < ActiveRecord::Base 
    belongs_to :project 

    validates_presence_of :name 
    validates_uniqueness_of :name, :scope => :project_id 

    validates_presence_of :project_id, :unless => lambda {|attribute| attribute.project.try(:valid?)} 
    validates_associated :project 

end 

이것은 의도 한 예이지만 내가하려는 것과 비슷합니다. accepts_nested_attributes_for가하는 일을 살펴 봤는데 빌드 된 속성을 프로젝트와 연관 ​​짓는 build 메소드를 사용합니다.

는 또한 나에게이 작업을 할 수있는 방법을 validates_presence_of :unless=>valid?

어떤 아이디어를 준 accepts_nested_attributes_for child association validation failing 보았다?

+0

나는이 문제를 accepts_nested_attributes_for를 사용하도록 변경하려고 시도했으며 같은 문제가 발생했습니다. validates_presence_of : project_id 호출에서 'project'는 nil을 반환합니다. –

답변

5

validates_associated는 가치가있는 것보다 더 많은 문제가있는 것처럼 보입니다. validates_presence_of : project_id를 삭제하면 예제가 작동합니다. 여기 유효성 검사를 복원하는 해커 예가 있습니다 (설명은 here입니다).

class ProjectAttribute < ActiveRecord::Base 
    belongs_to :project 

    validates_presence_of :name 
    validates_uniqueness_of :name, :scope => :project_id 

    validates_presence_of :project_id, :unless => Proc.new { |project_attribute| 
    project = project_attribute.project 
    ObjectSpace.each_object(Project) {|o| project = o if o.project_attributes.include?(project_attribute)} unless project 
    project 
    } 
end 
-1

project_id에 null이 아닌 제약 조건을 추가하고 펑키 한 일이 발생하면 폭발 시키십시오. 오, 그리고 당신의 테스트 커버리지가 좋다는 것을 보장하십시오.

관련 문제