2010-07-17 4 views
1

관련 모델의 특성에 따라 필드의 유효성을 검사하려고합니다. 코드를보고하는 것은 기본적으로 내가에만 필드가 있는지 확인하려면 내가 새 사용자를 작성하는 양식을 제출할 때reverse validates_associated

class User < ActiveRecord::Base 
    has_and_belongs_to_many :user_groups 
    has_one :profile, :dependent => :destroy 

    accepts_nested_attributes_for :profile 
    validates_associated \ 
    :profile, 
    :allow_destroy => true 
end 


class Profile < ActiveRecord::Base 
    belongs_to :user 

    validates_presence_of \ 
    :business_name, 
    :if => self.user.user_groups.first.name == 'Client' 
end 

, 난

undefined method `user_groups' for nil:NilClass 

를 얻을 수 (나는 희망을) 더 이해가됩니다 새 클라이언트를 만드는 경우 business_name.

는 또한 동일한 결과

:if => Proc.new { |p| p.user.user_groups.first.name == 'Clients' } 

을 사용하여 시도 하였다.

어쩌면 내가 완전히 잘못된 나무를 짖고 있지만, 이것을 달성하기위한 제안?

답변

1

당신은 user_id를 가져 와서 그 ID를 가진 User 객체를 찾는 belongs_to 연관을가집니다. 그러나 사용자가 저장되기 전에 프로필 모델의 유효성을 검사 중이므로 ID가 없습니다. 프로필의 유효성 검사는이 경우 아직 사용자를 호출 할 수 없습니다.

사용자 또는 프로필에서 트리거되도록이 논리를 분리해야하지만 먼저 프로필의 유효성을 검사하려는 경우 생성 된 사용자가 자신의 유효성 검사를 수행 할 것으로 기대할 수 없습니다.

이것은 닭고기 및 계란 문제입니다.

class Profile < ActiveRecord::Base 
    belongs_to :user 

    validates_presence_of \ 
    :business_name, 
    :if => is_business? 
end 

을하고 상황에 맞는 제대로 is_business 설정하려면 프로필 양식을 업데이트 :

당신은 프로필에 is_business 같은 열을 추가하고 다음과 같이 코드를 변경하여이 문제를 해결할 수 있습니다.

+0

음 ... validates_associated가 매개 변수를 허용 할 때까지 가능하지 않을 수 있습니다. – brewster

+0

여기에 논리가 뒤얽혀 있습니다. 프로파일의 독립 검증 로직을 분리 할 수있는 방법을 보여주기 위해 원래의 대답을 업데이트했습니다. is_business 플래그를 전달하여 프로파일 작성시 특수 비즈니스 validatoin을 트리거해야합니다. – Winfield

관련 문제