2011-12-07 3 views
0

私は、ユーザーが多くのオブジェクトを同時に編集できるフォームを持っています。フォームはform_tagを使用し、text_field_tag,select_tag、およびの多くのインスタンス(反復による)を使用します。変更された項目だけを保存するRailsフォームをどのように記述しますか?

現在構成されているように、フォームを送信すると、コントローラアクションは、ユーザーが変更を行ったかどうかにかかわらず、更新されたオブジェクトごとに.save!を呼び出します。これは明らかに理想的ではありません。

保存する必要のあるオブジェクトのみを保存できるように、フォームとコントローラの動作を変更するにはどうすればよいですか?

+1

私は "Place Editing gem"を使っていますが、これはすばらしいことですが、フォームを編集するときにすべてを保存するかどうかチェックするコードはありませんでした。 https://github.com/bernat/best_in_placeかryan batesのrailscastsをチェックしてくださいhttp://railscasts.com/episodes/302-in-place-editing – Hishalv

答えて

1

これは、それぞれの対応するモデルでbefore_saveフィルタを設定することで行います。現在のオブジェクトの保存された状態をロードし、相対的な属性を比較します。属性のいずれも変化していない場合は、falseを返します:言っ

class Post < ActiveRecord::Base 
    before_save :check_for_changes 

private 
    def check_for_changes 
    saved = Post.find(self.id) 
    should_save = false 
    if saved.body != self.body || saved.title != self.title 
     should_save = true 
    end 
    should_save 
    end 
end 

は、私が代わりに編集宝石は良いアイデアだと思います。そこにもこれを行う別の宝石があるかもしれません。私は個人的にそれを認識していません。

関連する問題