2011-01-13 16 views
3

私はモデル記事を持っています。 Article has_one ArticleContent。 ArticleContentはデフォルトですべての属性を検証します。しかし、私は追加の機能が必要です。 私はArticle.new()のパラメータの1つとして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モデルの状態列を持つことは有益である可能性があります。その値は、「新規」、「下書き」、「公開」などとなります。

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がやることをやっているだけです。

関連する問題