2012-04-15 17 views
1

ここでかなり基本的な質問は、深度が2以上にならないようにするために、カテゴリモデルのフィルタを前に書く必要があります。作成前にモデル属性を検証する方法

アプリ/モデル/ category.rb

before_create :check_depth 
    def check_depth 
    self.depth = 1 if depth > 2 
    end 

私が得る、私はエラーメッセージを返すために、1に深さを設定するのではなく、それを必要とするが、私も、この現在の設定を動作させることはできませんエラー

undefined method `>' for nil:NilClass 

ので、代わりに私は、私が代わりにエラーを送信する方法をやろうとしているように1の深さを設定するの?現在の機能が情報提供の目的で機能するよう助けてください。事前に感謝します

答えて

5

これを行うには複数の方法があります。

あなたのための最も簡単な解決策:

def check_depth 
    self.errors.add(:depth, "Issue with depth") if self.value > 2 # this does not support I18n 
end 

クリーンは、(あなたのcategory.rbの上部に、ちょうど追加)モデルの検証を使用している:

validates :depth, :inclusion => { :in => [0,1,2] }, :on => :create 

あなたの検証ロジックの場合より複雑になる場合は、カスタムバリデータを使用してください:

# lib/validators/depth_validator.rb (you might need to create the directory) 
class DepthValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    record.errors.add(attribute, "Issue with #{attribute}") if value > 2 # this could evene support I18n 
    end 
end 

このバリデータを使用する前に、それをロードする。初期設定で

変更後(およびバリデータを変更した後)に、レールサーバーを再起動する必要があります。私は単純明快なアプローチをお勧めします

if @category.save 
    # success 
else 
    # set flash information 
end 
+0

検証ロジックがあまり複雑でない場合、カスタムフィルタは必要ありません。 – emrass

+0

あなたが提供した最も簡単な答えで作業しているすべての情報をありがとう、私はカスタムバリデーターを使用するので、確かにI18nを使用しています。あなたの努力にとても感謝します。 – ruevaughn

+0

素晴らしい! I18nは上記の「最もクリーンな」ソリューション(オプション2)でも動作します。 [en | de | ...]。errors.messages.inclusionのロケールでの翻訳が必要な場合、またはここのロケールの例をhttps://github.com/svenfuchs/rails-i18n/treeで入手してください/ master/rails%2Flocaleを基準にしています。カスタムバリデータの場合は、エラーテキスト "mytext ..."の代わりに、depth_not_in_rangeのようなシンボルを入れて[locale]に翻訳してください.activerecord.errors.models.category.attributs.depth.depth_not_in_range – emrass

1

depthがnilなので、今はエラーが発生しています。私はあなたがエラーを送信して...どこにエラーを送信することによって、何を意味しています本当にわからない

def check_depth 
    self.depth = 1 if self.depth > 2 
end 

:ように私は、あなたがself.depthを使用したいと考えていますか?あなたはモデルです...

+0

私は次のようなエラーを送信すると想像していました。通知または何かが可能ですモデルでそれをしないでください。これはモデルではなくコントローラでやっていなければならないチェックですか? – ruevaughn

+0

私はそう信じています...しかし、あなたはover_depth = trueのようなオブジェクトの属性を設定することができます... – Nobita

+0

True私はそれを試みるかもしれません、私のコントローラのbefore_filterを作成し、それとも私のコントローラーでそれについて行く方法は何ですか? – ruevaughn

2

validates :depth, :depth => true, :on => :create # the :on => :create is optional 

問題は、あなたがそうのようなあなたのフラッシュ通知を設定することができ@category.saveに発生します:あなたのcatagoryモデルで今すぐ

# in your Comment.rb 
validates_inclusion_of :depth, in: 0..2, message: "should be in the range of 0..2" 
+0

これは私にとってはうまくいくようでした同じように。ご協力いただきありがとうございます – ruevaughn

関連する問題