2011-01-13 11 views
3

Ich habe Modell Artikel, zum Beispiel. Artikel has_one Artikelinhalt. ArticleContent verfügt standardmäßig über eine Validierung aller Attribute. Aber ich brauche zusätzliche Funktionalität - um Entwurf Artikel ohne Validierung zu speichern. Also passiere ich: draft => false als einen Parameter in Article.new(), als nächstes mache ich @ article.build_article_content(). Es gibt einige nicht funktionierende Code in ArticleContent:ActiveRecord Validierung durch Elternattribut

def draft? 
    raise self.article.draft 
    end 

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

Natürlich ist es nicht funktionieren. Zum Zeitpunkt des Entwurfs? Ausführung Es gibt kein passendes Artikelobjekt irgendwo, also gibt self.article nil zurück. Netter Versuch, Codemonkey ...

Jeder hat einige süße Ideen? Ich denke, @ content.save zu machen! ist nicht eine sehr gute Idee

UPDATE

ich so versucht: das

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? 

Es funktioniert, aber wie kann ich Gruppe?

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

Sagt dieser Entwurf? Methode wurde nicht gefunden. Ich soll auch

@article.content.draft = @article.draft 

tun, und es sieht aus wie schmutzig-dirty Hack zu

+0

Entschuldigung, ich habe gerade erst Ihr Update gesehen. – noodl

Antwort

2

Dies ist ein typischer Anwendungsfall für eine Zustandsmaschine. Es gibt mehrere Rails Plugins, die für diese sorgen.

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

Wenn Sie es aufschlussreich sein könnte, keine vollständige Zustandsmaschine Umsetzung müssen noch eine Zustandsspalte in Ihrem ArticleContent Modell zu haben. Seine Werte wären "neu", "Entwurf", "veröffentlicht" und so weiter. Ihre Validierungen auf dem Spaltenwert aussehen würden bei der Entscheidung, was zu tun ist, wie:

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

(Ich bin mir ziemlich sicher, das ist nicht die richtige Syntax, aber Sie sollten bekommen, was ich bin mit dem Ziel an.)

Um Ihre UPDATE

zu beantworten, versuchen Sie 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 

Blick auf den Code, es gibt ein paar Gerüche. Um eine Validierung zu übergehen, ist die Aufgabe errors.add(blah), keine Ausnahme auszulösen. Außerdem sind die für den Zugriff auf die Entwurfsspalte definierten Methoden etwas redundant. Sie tun nur, was AR sowieso tun würde.

Verwandte Themen