2011-01-09 18 views
12

私がskip_before_filterを使用するのは、アプリケーションがプロダクションモードの場合のみです。 (私は自分の開発インスタンスをパブリックにしたくないので、アプリケーションがどのタイプのインスタンスを自動的に検出し、プロダクションモードでないときはログイン画面を表示するようにしたい)。だから、私のアプリケーションのコントローラは、次の行がありますskip_before_filterは条件を無視します

before_filter :authenticate_user!, :except => "sign_in" #redirects to log-in 

をとページを表示するためのコントローラは、このラインを持っています

skip_before_filter :authenticate_user!, :only => :show, :if => :in_production 
#public pages are public, but only when in production. 

そしてin_production単純です:

def in_production 
    ENV['RAILS_ENV']=='production' 
    end 

私はそれが実現しますここでは他の手段かもしれませんが、なぜskip_before_filterが条件付きを無視し、before_filterをスキップするように見えるのか不思議です。私は行方不明のものがありますか?

+0

Rails 2.3.9とDevise認証宝石の使用。 – Smudge

答えて

17
でこれを入れてみてください、私は skip_before_filter:ifパラメータを受け入れるかわからないので、それはまだ動作しない場合、私は

(skip_before_filter :authenticate_user!, :only => [:show]) if in_production 

この構文を試してみました

これはRailsのバグです(または少なくともドキュメント化されていない奇妙な動作です)。 https://github.com/rails/rails/issues/9703

このスレッドでは、(ねじれた)解決策を見つけることができます。

は、代わりに

skip_before_filter :authenticate_user!, :only => :show, :if => :in_production 

書き込み

skip_before_filter :authenticate_user!, :only => :show 
before_filter  :authenticate_user!, :only => :show, :unless => :in_production 

のそれは私のために働きました。

4

アプリケーションコントローラ

if ENV['RAILS_ENV']=='production' 
    skip_before_filter :authenticate_user!, :only => :show 
end 
+0

最初の例が動作します。それが受け入れられない場合:paramの場合、なぜそれについて沈黙していますか? – Smudge

+1

'skip_before_filter'は' * filters'配列のスプラットをとります。したがって、無効な引数があるかどうかを知ることはできません。スプラットが処理されるとき、無効なハッシュキーは無視される(または取り出されない)と想像します。 –

6

私は、説明されたシナリオでSmartLoveによってポストされた解決策が、一種のセキュリティホールまたは予期しない動作を示すことを発見しました。ラインので:only => :show

before_filter :authenticate_user!, :only => :show, :unless => :in_production

は、をApplicationControllerにで定義された既存のbefore_filterをオーバーライドあります。つまり、このコントローラのすべてのアクション(たとえば、edit、:createなど)は、show:を除いて、authenticate_user!を省略します。フィルタ。

可能な解決策は:only句を削除し、条件付きメソッド内で呼び出されるアクションをチェックすることです。例:

before_filter :authenticate_user!, :unless => :skip_filter? 

def skip_filter? 
    params[:action] == "show" && in_production 
end 
関連する問題