2009-08-31 7 views
0

特定の条件に合致しなかった場合、処理を中断することがあります(オブジェクトがそのようなユーザーなどによって所有されていないなど)。Rails resource_controllerが中断していますか?

私はこれを使用する必要があります。私は はアクセス権が になる前にロードするオブジェクトを必要とするので、無効なアクセスであれば アクションを中断したい状況があるでしょう。

答えて

1

OKこれはRCで作業しているときに考えていたものです。

通常のRC活動のようなものです:

def show 
    load_object 
    before :show 
    response_for :show 
rescue ActiveRecord::RecordNotFound 
    response_for :show_fails 
end 

だから、あなたはいくつかの条件が失敗した場合だけload_object後にショーを中断するとします。

私はRC :)を変更する以外の(考えることができると、それを行うための最善の方法は次のとおりです。を使用 before_filter 状態

  • をチェックする before_filter

    • 使用オブジェクトまたはコレクションヘルパー(アクションに応じて)。このように、RCアクションの実装でload_object/load_collectionは、あなたの使用法からキャッシュされた同じ値を使用するため、追加のクエリは行われません。
  • +0

    それは正しいと思う - 私はキャッシュされた事実を無視した。 –

    0

    あなたはbefore_filterに言及されていると仮定:

    どれrenderまたはredirectコールは、フィルタチェーンとアクションの実行を中止すべきです。だから、あなたのアクセスコントロールのフィルターを入れて、「もの」をロードしてから、エラーメッセージを表示してください(良いウェブカルマのための適切なステータスコードとw3cビートダウンを防ぐ)。

    これはあまりにも難しくないと思っている限り、うまく動作するレールの別の領域です。

    何か助けが必要ですか?

    +0

    あなたが逃した、それは問題があるオブジェクトのセキュリティ(所有権)によって決定します。しかし、Vitalyはキャッシュされているので、フィルタの前に実際に使用することができます。 –

    0

    ヴィタリーのアプローチは、おそらく正しいですが、私はそう参考として掲載し、あまりにも面白いオーバーエンジニアリングのアプローチを持っている:フックの前に、AccessDeniedException を投げる時

  • around_filter

    1. 使用
    2. aroundフィルタで例外をキャプチャします。

    これも同様です。

  • 0

    事前確認のためにbefore_filtersを書くことが非常に頻繁にある場合は、Aegisが便利です。 1つのファイルにアクセスルールを定義して、誰が何にアクセスできるかを一目で確認することができます。

    また、resource_controllerとの容易な統合のために構築されました。

    関連する問題