web-dev-qa-db-ja.com

Railsでbefore_filterをスキップ

わかりやすくするために、名前とオブジェクトは簡略化されています。基本的な概念は同じままです。

dogcat、およびhorseの3つのコントローラーがあります。これらのコントローラーはすべて、コントローラーanimalから継承します。コントローラーanimalには、ユーザーをそのように認証するbeforeフィルターがあります。

before_filter :authenticate

def authenticate
  authenticate_or_request_with_http_basic do |name, password|
    name == "foo" && password == "bar"
  end
end

showdogアクションでは、すべてのユーザーにオープンアクセスが必要です(認証をスキップします)。

dogの認証を個別に記述する場合、次のようなことができます。

before_filter :authenticate, :except => :show

ただし、doganimalを継承するため、コントローラー固有のアクションにアクセスできません。 animalコントローラーに:except => :showを追加すると、showdogアクションだけでなく、catおよびhorseの認証もスキップされます。この動作は望ましくありません。

showを継承しながら、doganimalアクションに対してのみ認証をスキップするにはどうすればよいですか?

61
Yuval Karmi
class Dog < Animal
  skip_before_filter :authenticate, :only => :show
end

フィルターと継承の詳細については、 ActionController :: Filters :: ClassMethods を参照してください。

111
Jimmy Cuadra

与えられた2つの答えは半分正しいです。すべての犬のアクションを開かないようにするには、次のように「show」アクションにのみ適用されるようにskip_before_filterを修飾する必要があります。

class Dog < Animal
  skip_before_filter :authenticate, :only => :show
end
12
rigyt

これには、skip_before_filterを使用できます

Rails API で説明されています

あなたの例では、dogjustを含める必要があります

skip_before_filter :authenticate
3
ajmurmann

Rails 4を使用する小さな更新で、現在はskip_before_action :authenticate, :only => :showそして、before_filtersはbefore_action代わりに。

2
Thresh