1

私のコントローラーの 1 つには 100 近くのメソッド (ルートなど) があり、ほぼすべてのメソッドが同じコードを開始して、id パラメーターが無効な場合はエラー ページにリダイレクトし、その後、id が属していないユーザーの場合は同様のチェックを行います。ユーザーのアカウント:

def something
  @foo = Foo.find_by_guid(params[:id])
  unless @foo
    @msg ||= { :title => 'No such page!',
      :desc => "There is no such page!" }
    render :action => "error" and return
  end
  unless @foo.owner_id == current_user.id
   @msg ||= { :title => 'Really?',
      :desc => "There is no such page." }
    render :action => "error" and return
  end

コードがレンダリングを行っていることを考えると、そのようなページ ID と所有者 ID の検証を DRY する最良の方法は何ですか?

この時点でやりたくないことは、CanCan のようなブラックボックスのロールとアクセス許可ライブラリにオフロードすることです...私の目標は、これを処理するためのアプリ内コードをできるだけクリーンにすることです。

4

2 に答える 2

4

before フィルターが必要なようです:

class MegaController < ActionController::Base
    before_filter :grab_and_check_foo
    #...
private
    def grab_and_check_foo
        @foo = Foo.find_by_guid(params[:id])
        if !@foo
            #... render some error stuff
        end
        if @foo.owner_id != current_user.id
            #... render some other error stuff
        end
    end
end

before-filter は、何かをリダイレクトまたはレンダリングすることにより、通常のコントローラー プロセスから抜け出すことができるため、問題はありません

于 2012-09-30T03:35:04.900 に答える
1

所有権をチェックし、チェックに基づいてレンダリングまたはリダイレクトする前にフィルターを使用できます

于 2012-09-30T03:34:50.450 に答える