2012-04-05 11 views
1

私はユーザーがいくつかの技術を研究し、それに対していくつかの報酬を得ることができる状況に陥っています。今、これらの報酬は、いくつかのアイテムを作成したり、生産を増強したりすることができるようなものです。フィルタ内でフラッシュメッセージを処理する適切な方法

私が現在やっていることは、コントローラのフラッシュメッセージとリダイレクトを処理することです。だから、アイテムを作るためには、特定の技術を研究しなければならないケースを想像してみてください。私のコントローラは次のようになります:

def create 

    flash[:error] = I18n.t('error.not_researched') and redirect_to research_url and return if not current_user.has_research?(research) 
    .... 
    .... 
end 

もちろん、これはうまくいきますが、私はそれが最良の方法です。私は多分before_createフィルタを使ってそれを行うことを考えましたが、このように、私は実際にフラッシュメッセージを設定することはできません。

したがって、私はベストプラクティスという点でどのように進むべきかを尋ねたいので、コードは可能な限りDRYであり、得られるように書かれています。

+0

あなたの質問が間違っていると私に知らせてくれます。フラッシュメッセージの表示は、通常、使用しているレイアウトファイルの1つで行われます。そうすれば、それはすべての意見の中心的な場所です。コントローラーであなたが抱いていることは正しいです。 before_filterは必要ありません。 Plsはあなたに例が必要なのかどうかを知らせ、私はそれを投稿することができます。希望が役立ちます。 – Prashanth

答えて

1

実際、問題はフラッシュメッセージを設定していないことです。モデルで検証を行い、コントローラに保存されているかどうかを確認することで、これを行うことができます。

unless research.save 
    flash[:error] = I18n.t('error.not_researched') 
    redirect_to research_url 
    return 
end 

あなたのケースでの問題は、あなたがcurrent_userへのアクセスを必要とするということであり、これは、コントローラは、このチェックを行うには、適切な場所であることを示唆しています。

スタイルに関するサイドノート:このチェックを複数の行に分割すると、コードがより明確になると思います。

unless current_user.has_research?(research) 
    flash[:error] = I18n.t('error.not_researched') 
    redirect_to research_url 
    return 
end 
+0

まさにそのtsherif。私は実際にcurrent_userとより多くのデータを必要とするでしょう。コントローラーがあなたにとって正しい方法であるように思えると嬉しく思っています。私はコントローラで複数のチェックをしているので、実際には単一のライナーを使用しています。 – Spyros

関連する問題