2012-02-07 14 views
0

問題の流れは次のようになります。誰かがオブジェクトを持ち、タイトルを持っています。ユーザは、編集コントローラ内でこのオブジェクトの名前をフォームで編集できます。名前は空でない必要があるため、ユーザーが空の名前でオブジェクトを保存しようとすると、検証エラーがスローされます。Rubyフォームは検証に失敗し、空の名前とブレッドクラムで「編集」を表示します。どうすれば修正できますか?

if @object.update_attributes(params[:object]) 
    flash[:notice] = "Successfully updated object" 
    redirect_to @object 
else 
    render :action => "edit" 
end 

この検証エラーにより、render :action => "edit"が呼び出されます。この問題はここでは編集ビュー上で発生し、一連のブレッドクラムとタイトルの両方が塗りつぶされようとしますが、@object.update_attributes(params[:object])がすでに呼び出されているので、オブジェクトはデータベースに保存されていませんが、 "これにより、ブレッドクラムは「Objects >> AwesomeObject >> Edit」の代わりに「Objects >> >> Edit」のように見えます。

私は最後に保存した名前を残すことができます。ユーザーが空白のフィールドを修正している間にデータベースをプレースホルダとして使用する ""

答えて

1

それは、このような、たとえば、データベースから再び名を取得するメソッドを追加することが可能です。

def breadcrumb_title 
    persisted? ? Object.find_by_id(id).title : self.title 
end 

オブジェクトはモデルの名前であり、永続化の呼び出しはインスタンスがデータベースに存在することを確認します。ただし、不要なデータベース呼び出しが生成される可能性があります。もう1つのオプションは、組み込みのchangesハッシュを使用して、以前の値が何かを確認することです。このような変化ハッシュ作品:

?> a = Object.new 
=> #<Object id: nil, title: nil> 
?> a.changes 
=> {} 
?> a.title = "first title" 
=> "first title" 
?> a.changes 
=> {"title"=>[nil, "first title"]} 
?> a = Object.first 
=> #<Object id: 1, title: "Original title"> 
?> a.changes 
=> {} 
?> a.title = "title changed" 
=> "title changed" 
?> a.changes 
=> {"title"=>["Original title", "title changed"]} 

だからあなたは、このような方法で、以前のタイトルを取得することができるはずです。

def breadcrumb_title 
    self.errors["title"].present? ? self.changes["title"].first : self.title 
end 

タイトルおよびもしあればエラーがあった場合、これはチェックしますそれはタイトルの前の値をとる。しかし、エラーがなければ、titleの現在の値がデフォルトになります。

+0

このコードは魅力的に機能しました!私は今まで組み込みの変更のハッシュを知りませんでした。 ありがとうございます! –

0

あなたは別のインスタンス変数に入れて、あなたのビューでそれを使用することができるはず

@object = Object.find(....) 
@breadcrumb = @object.title 
@object.update_attributes(params[:object]) 
0

についてActiveModel::Dirtyを読み、これを使用しよう:

def breadcrumb_title 
    @object.title.presence || @objet.title_was 
end 

彼が存在しているか、それ以前の持続さ​​れた元のタイトル場合は、このメソッドは、現在有効なタイトルを返す必要があります。

関連する問題