わかりやすくするために、名前とオブジェクトは簡略化されています。基本的な概念は同じままです。
dog
、cat
、および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
show
のdog
アクションでは、すべてのユーザーにオープンアクセスが必要です(認証をスキップします)。
dog
の認証を個別に記述する場合、次のようなことができます。
before_filter :authenticate, :except => :show
ただし、dog
はanimal
を継承するため、コントローラー固有のアクションにアクセスできません。 animal
コントローラーに:except => :show
を追加すると、show
のdog
アクションだけでなく、cat
およびhorse
の認証もスキップされます。この動作は望ましくありません。
show
を継承しながら、dog
のanimal
アクションに対してのみ認証をスキップするにはどうすればよいですか?
class Dog < Animal
skip_before_filter :authenticate, :only => :show
end
フィルターと継承の詳細については、 ActionController :: Filters :: ClassMethods を参照してください。
与えられた2つの答えは半分正しいです。すべての犬のアクションを開かないようにするには、次のように「show」アクションにのみ適用されるようにskip_before_filterを修飾する必要があります。
class Dog < Animal
skip_before_filter :authenticate, :only => :show
end
これには、skip_before_filterを使用できます
Rails API で説明されています
あなたの例では、dog
justを含める必要があります
skip_before_filter :authenticate
Rails 4を使用する小さな更新で、現在はskip_before_action :authenticate, :only => :show
そして、before_filtersはbefore_action
代わりに。