2010-12-12 11 views
1

私は受信メールを取り込み、そのメールを処理するメソッドを構築しています。途中で、電子メールが正常に処理されないようにする多くのことがあります。Rails 3 - 複雑なSwitch文/ If文を処理する方法

コードにはSwitch Statements(case/when/end)とIf文がいっぱいです。私は、これを行うよりスマートでクリーンな方法を学びたいと思います。さらに、エラーを追跡し、最後にエラーを返す電子メールを送信する場所が1つあります。このようなものはレールで可能ですか?

その後
@error = [] 

Case XXX 
when xxxx 
    if XXXXX 
    else 
    @error = 'You don't have permission to reply to the xxxxx' 
    end 
else 
    @error = 'Unfamilar XXXX' 
end 

最後に何かのような...ここに助けを

If @errors.count > 0 
    Send the user an email letting them know what went wrong 
else 
do nothing 
end 

感謝。上記のようなロジックを書く方法を教えてくれる他のチュートリアルを知っていれば、それは素晴らしいことでしょう。今、私はcase/if文が3レベル深くなっていますが、それを直に保つのは難しいです。

ありがとうございます。

答えて

2

例外を使用することをおすすめします。 this tutorialで始まり、次にGoogle、試行錯誤を使用してそこから進みます。

編集:さらに複雑なケースでは、例外が適切なツールではない可能性があります。あなたは(他の回答を参照してください)例えば、代わりにバリデータ機能を使用する場合があります、またはあなただけ例えば、早期の代わりに営巣IFSの返すことができます:

unless sender_valid? 
    @error = "Sender invalid" 
    return 
end 
unless subject_valid? 
    @error = "Invalid command" 
    return 
end 
# normal no-errors flow continues here... 
+0

私は非常に例外を好みます。このメソッドからの暗黙的な終了は、ほとんどの場合、まさにあなたが望むものです。 – aceofspades

+0

実際の例外を処理するときにのみ例外を使用します。予想されるフローの場合は、例外を使用しないでください。たとえば、ユーザーが入力したデータは間違っていることが多く、例外を伴って決して処理するべきではありません。コードをクリーンアップする本当の方法は、小さな論理チャンク(メソッドとクラス)に分割することです。ネストされたケースとifを持つことは、通常、デザイン上の問題です。この場合の例外の使用は、まさにバンダイですが、実際の解決策ではありません。 – iain

+0

複雑なケースがある場合は、例外を使用するのではなく、バリデーター関数に抽象化する方がよい場合があります。あなたの選択肢を測ります。 – moeffju

1

何かが右でないときは、エラーがスローされることがあります。あなたのメソッドの終わりにそれをキャッチします。

http://phrogz.net/programmingruby/tut_exceptions.html

はあなたのコードをより読みやすくすると、スイッチの多くを持っていないし、/ then文場合は、特定の側面を検証し、あなたの主なエラーチェック方法からそれらを呼び出す別のメソッドを作成することができます。

+0

例外を使用してアプリケーションを最大17回遅くする可能性があります – mpapis

+0

@mpapis:Rubyでは本当ですか?参考にしてもらえますか? – klew

+0

http://rpheath.com/posts/237-raising-custom-exceptions-in-rails-コメント内 – mpapis

1

メッセージをモデルにマップすることはできますか?すべてのif/switchロジックが検証され、レールによって自動的に処理されます。

ErrorsDescription = { 
    :first => "First error", 
    :second => "Second error", 
    ... 
} 

と使用シンボルの代わりの文字列:良い出発点は読む価値もactive record validations guide

あるaction mailer guide

3

まずですが、私は単純なハッシュとして各エラーメッセージにシンボルを割り当てます。

ifとswitch文。基本的に私は本当にあなたを助けることができません。なぜなら、あなたにはどんな種類の条件文があるのか​​わからないからです。何をチェックしていますか?どうして3レベルの深い条件がありますか?おそらくifとswitchを使って簡単に書くことができます - これがこの問題に対する私の最初の答えです。あなたはこのように書くことができますので、別の解決策は、読みやすさを改善するための簡単な方法を書くことがあります。

if @email.has_wrong_reply_to_address? 
    @errors << :wrong_reply_to_address 
else 
    ... 
end 

また、@mpapisが示唆されているように、あなたはRailsのを使用することができ、検証システムではなく、ActiveRecordとしてではなくActiveModelとして構築します。 Hereあなたはそれを行う方法とそれがどのように動作するかについてのいくつかの例を持っています(また、hereを見てください)。もちろん、カスタム検証を書く必要があるかもしれませんが、単純な方法に過ぎません。

@email.valid? 

をし、そうでない場合は、ハッシュ内のすべてのエラーを持っている:あなたはすべての仕事の上に行うならば、あなただけ使用することができます

@email.errors 

普通ActiveRecordオブジェクトのように。

次に、クラスをsend_error_emailメソッドで拡張すると、エラーがあった場合に電子メールを送信できます。

編集:

これはコメントに添付された新しい情報です。

ネストされたifを使用してスイッチする必要はありません。あなたはそれがこのように見えることができます:

def is_this_email_valid? 
    if !email_from_user_in_system? 
    @errors << :user_not_in_system 
    return false 
    end 
    if comment_not_exists? 
    @errors << :comment_not_exists 
    return false 
    end 
    if user_cannot_comment_here? 
    @errors << :permision_error 
    return false 
    end 
    ... 
    true 
end 

次に、あなたがそれを使用することができます。

if [email protected]_this_email_valid? 
    @email.send_error_mail 
end 
+0

ありがとうございます。それは3段階深くなっている理由です。まず、電子メールがシステム内のユーザーから来たものであることを確認します。それから私は彼らが存在するコメントに返信していることを確認します。それから彼らはそのコメントに返信する許可を持っていることを確認します。私はコメントが空白/ nilでないことを確認します。理にかなっている? – AnApprentice

+0

@AnApprentice:うん、意味がある。しかし、なぜコメントへの返信はメールを通じて行われますか?あなたはこれのためにHTMLフォームを使用できませんか? – klew

+0

@AnApprentice:早く退室してみませんか?例えば。 "メールが有効なユーザーからのものでない場合は、エラーを返します"。 – moeffju

関連する問題