2012-01-17 17 views
2

これは重複した質問であれば間違いなく私の謝罪です。私は答えを見つけようとしましたが、Railsにはとても新しいので、何を検索するのか分かりませんでした。Ruby on Rails:コントローラー内の複数のアクションで同じチェック

私にはセキュリティがあるコントローラがあります。

if @persona.user_id != @current_user.id 

    flash[:notice] = "Sorry, we couldn't find that persona" 
    redirect_to '/personas/' 

else 

    # do something else 

これは比較的簡単です:私は、ユーザーがこのような彼らが作業しているペルソナを、所有しているかどうかを確認する必要のあるアクションを破壊し、ショー、編集、更新のために。しかし、私はどのようにDRY方法でこれを行うのですか? elseの前のコードは4つのアクションすべてで繰り返され、elseステートメントの後のコードはコントローラごとに異なります。

ありがとうございます。

http://guides.rubyonrails.org/action_controller_overview.html#filters

あなたもログインしているユーザーを返すcurrent_userメソッドを記述する必要があり、それを乾燥させるために:ここ

リチャード

答えて

2

あなたはbefore_filterを使用する必要があります。このような何か:

class PersonasController < ApplicationController 
    before_filter :check_owner, :only => [:show, :edit, :update, :destroy] 

    def show 
    #... 
    end 

    #...etc. 

    protected 

    def check_owner 
    redirect_to personas_path unless params[:id] == current_user.id 
    end 
end 

また、あなたはすでにあなたのapplication_controller.rbに行くものを、持っていない場合current_userメソッドを書くことにdavidbの助言@取ります。このようなもの:

class ApplicationController < ActionController::Base 
    helper_method :current_user 

    def current_user 
    @current_user ||= session[:user_id] ? User.find(session[:user_id]) : User.new 
    end 
end 

モデルのセットアップ方法によっては、このすべてを調整する必要があります。これは、あなたが何をする必要があるのか​​/やるべきなのかという一般的な考えです。

+0

ファンタスティック感謝。 –

1

使用before_filterは概要です!

0

セキュリティロジックをbefore_filterに移動できます。それはあなたの行動の前に実行され、あなたのセキュリティチェックを行います。

お使いのコントローラファイル:

class TestController 

    before_filter :check_persona, :only => [:show, :edit, :update, :destroy] 

    private 

     def check_persona 
     if @persona.user_id != @current_user.id 
      flash[:notice] = "Sorry, we couldn't find that persona" 
      redirect_to '/personas/' 
     end 
     end 

end 
+0

これは 'before_filter'が呼ばれた後に' @ persona'がメソッド内に設定されている可能性があるため、うまくいきません。 –

+0

before_filterでも読み込むことができます。 –

関連する問題