2011-05-30 8 views
1

私は、kersを受け入れた_nested_attributes_forの教師モデルを持っています。 klassにユーザーがいて、検証メッセージを出力したい場合、klassを削除できないようにしたい。rails 3 - 破壊検証の前にネストされた属性を受け入れる。

これは=私がaccepts_nested_attributes_forを使用し、「klasses_attributes」に渡していたときにユーザーが含まれている先生からのklassを削除しようとしたとき、私は検証が失敗したい...私が持っているもの

class Teacher < ActiveRecord::Base 
    accepts_nested_attributes_for :klasses, :reject_if => proc { |a| a['name'].blank? }, :allow_destroy => true 
end 

class Klass < ActiveRecord::Base 

    belongs_to :teacher 
    has_many :users 
    before_destroy :reject_if_has_users 

    private 

    def reject_if_has_users 
     if users.length > 0 
     errors.add_to_base "You cannot delete this class as it contains users." 
     false 
     else 
     true 
     end 
    end 

end 

です> {"0" => {"name" => "test"、 "_destroy" => "1"、 "id" => "17183"}ハッシュ

上記の方法では、error.add_to_base行がない場合、クラスが削除されません。ただし、検証メッセージは表示されません。私はその行を持っているとき、削除を妨げません。レコードを保存する場合にのみ、レコードを削除するとき

おかげで、

ティム

答えて

1

検証は行われません。私が私のプロジェクトの1つでこれを処理した方法は、モデルの例外を発生させ、その例外から私のコントローラで救助し、フラッシュアラートを表示しています。このように:

モデル:

class Klass < ActiveRecord::Base 
    before_destroy :reject_if_has_users 

    private 

    def reject_if_has_users 
    raise "You cannot delete this class as it contains users." if users.length > 0 
    end 
end 

教師コントローラ:

def update 
    # Code for updating the teacher 
rescue RuntimeError => e 
    redirect_to teacher_url(@teacher, :alert => e.message) and return false 
end 
+0

私は私が削除されます削除klassesのハッシュを含むことができ、教師の記録を保存しています、destroyメソッドを呼び出していないです魔法のようにaccepts_nested_attributes_forによって。例えば。 "klasses_attributes" => {"0" => {"name" => "テスト"、 "_destroy" => "1"、 "id" => "17183"} – Tim

+0

申し訳ありません、十分に質問してください。私は私の答えを書き換えます... – Mischa

+0

私は私の答えを更新しましたが、あまりきれいではありません。コードにいくつかのコメントを追加して、何が起こっているのかを明確にする必要があります。私はもっ​​と良い解決方法を見たいと思っています。がんばろう。 – Mischa

関連する問題