2011-01-13 3 views
3

예를 들어 모델 아티클이 있습니다. Article has_one ArticleContent. ArticleContent는 기본적으로 모든 속성을 검증합니다. 하지만 추가 기능이 필요합니다. 즉, 유효성 검사없이 드래프트 아티클을 저장해야합니다. 그래서 Article : new()의 매개 변수 중 하나 인 draft => false를 전달하고, 다음으로 @ article.build_article_content()를 수행합니다. ArticleContent에는 작동하지 않는 코드가 있습니다.상위 속성에 의한 ActiveRecord 유효성 확인

def draft? 
    raise self.article.draft 
    end 

    validates_presence_of :header, :message => "We have no fuckin' header!", :unless => :draft? 

물론 작동하지 않습니다. 초안의 순간에? 실행 아무 곳에서나 적절한 Article 객체가 없으므로 self.article은 nil을 반환합니다. 좋은 시도, codemonkey ...

누구나 달콤한 아이디어가 있습니까? 나는 @ content.save를 만드는 것을 생각한다! 아니 내가 그렇게 노력

아주 좋은 생각

UPDATE입니다 :

def draft 
    self[:draft] 
end 

def draft=(value) 
    self[:draft] = value 
end 

def draft? 
    self[:draft] 
end 

validates_presence_of :field1, :message => "msg1", :unless => :draft? 
validates_presence_of :field2, :message => "msg2", :unless => :draft? 
validates_presence_of :field3, :message => "msg3", :unless => :draft? 

그것은 작동하지만, 내가 어떻게이 그룹 수 있습니까?

unless self.draft? 
    validates_presence_of :field1, :message => "msg1" 
    validates_presence_of :field2, :message => "msg2" 
    validates_presence_of :field3, :message => "msg3" 
end 

초안을 말하고 있습니까? 메서드를 찾을 수 없습니다. 또한 내가

@article.content.draft = @article.draft 

을해야 그리고 그것은 더러운 더러운 해킹 너무

+0

죄송합니다, 방금 업데이트를 보았습니다. – noodl

답변

2

이 상태 머신에 대한 일반적인 사용 사례처럼 보인다. 그것들을 제공하는 여러가지 레일 플러그인이 있습니다. 당신이 완전한 상태 머신의 구현이 필요하지 않은 경우

http://ruby-toolbox.com/categories/state_machines.html

는 여전히 ArticleContent 모델의 상태 열을 가지고 교훈이 될 수 있습니다. 그 값은 "new", "draft", "published"등이 될 것입니다.

validates :content, :presence => true, :unless => Proc.new { |a| a.state == "Draft" } 

(나는 그 올바른 구문이 아니다 확신하지만 당신은 내가 목표로하고있는 무슨을 받아야합니다.)

:처럼, 무엇을 결정할 때 당신의 검증은 열의 값에 보일 것이다 업데이트에 대한 답변을 얻으려면

with_options를 시도해보십시오.

with_options :unless => :draft? do |o| 
    o.validates_presence_of :field1, :message => "msg1" 
    o.validates_presence_of :field2, :message => "msg2" 
    o.validates_presence_of :field3, :message => "msg3" 
end 

코드를 보면 몇 가지 냄새가 있습니다. 유효성 검사를 수행하기 위해 수행 할 일은 errors.add(blah)이며 예외는 발생하지 않습니다. 또한 초안 열에 액세스하기 위해 정의 된 메서드는 약간 중복됩니다. 그들은 AR이 어쨌든 할 일을하고 있습니다.