Domanda

I nomi e gli oggetti sono stati semplificati per amor di chiarezza. Il concetto di base rimane lo stesso.

Ho tre controllori: dog, cat e horse. Questi controllori tutto ereditano dalla animal controller. Nel animal controllore, ho un prima filtro che autentica un utente come tale:

before_filter :authenticate

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

Nel azione show di dog, ho bisogno di avere libero accesso a tutti gli utenti (saltare l'autenticazione).

Se dovessi scrivere l'autenticazione separatamente per dog, avrei potuto fare qualcosa di simile:

before_filter :authenticate, :except => :show

Ma dal momento che eredita da dog animal, non ho accesso alle azioni di controllo-specifiche. Aggiunta :except => :show nel controllore animal non solo salta autenticazione per l'azione di show dog, ma anche quella di cat e horse. Questo comportamento non è desiderato.

Come posso ignorare l'autenticazione solo per l'azione di show dog pur ereditando da animal?

È stato utile?

Soluzione

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

ActionController :: Filtri :: ClassMethods per più informazioni filtri e l'ereditarietà.

Altri suggerimenti

Le due risposte sono metà di destra. Al fine di evitare di fare tutte le vostre azioni cane aperto, è necessario qualificare lo skip_before_filter da applicare solo per l'azione di 'show' nel seguente modo:

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

Per questo si può utilizzare skip_before_filter

E 'spiegato nella Rails API

Nel tuo esempio dogjust dovrebbe contenere

skip_before_filter :authenticate

Solo un piccolo aggiornamento che utilizza rotaie 4, è ora skip_before_action :authenticate, :only => :show e che before_filters dovrebbe ora utilizzare before_action posto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top