2010-12-19 22 views
0

私はオンラインで素晴らしい例を見つけていないので、簡単な質問をして簡単な答えを得ることができます。穏やかな。 :)モデルによるカスタム検証:保存に失敗しました

私は投稿モデルを持っています。

p = Post.find(1) 
p.title = "This is the Title of this Article" 
p.url_title = "this-is-the-title-of-this-article--created-by-user-name" 

投稿が作成されると、タイトルに基づいて:url_titleが作成されます。これは、退屈で非記述的なIDを公開するのではなく、データベースでキーオフする方法です。

私はこれをビルドします:before_saveにurl_titleを入れて、なぜvalid_uniqueness_ofを使うことができないのですか?before_saveが始まる前にバリデーションが行われているように見えるため、url_titleを検証します。

したがって、私は次のことを保証する必要があります。url_titleは一意です。私は "--created-by-#{p.user.name}"を追加して、異なるユーザーから同じタイトルを複数使用することを許可します。

私は、保存する前にデータベースに固有のurl_titleを確認し、一意でない場合は、エラーを発生させてユーザーに知らせるカスタム確認を行う必要があります。

これを行う最善の方法についての考え方はありますか? 「

答えて

1

これを使用して、その後

validate_uniqueness_of :url_title, :message => "This title is taken, please choose a different title" 
0

はちょうどあなたのPostモデル

+0

おっとをurl_titleするための適切な検証を追加url_title

before_validation_on_create :create_url_title .... private def create_url_title url_title = ..... end 

を作成します。私は重要な部分を省いた。私の改訂された記事を見てください。 –

2

あなたはbefore_saveからbefore_validationにコールバックを移動することができます(hereを参照)に

validates_uniqueness_of :url_title 

を追加します。このコールバックは作成アクションと更新アクションで実行されるため、必要であれば十分です。

関連する問題