Skip before_filter in Rails
-
24-09-2019 - |
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
?
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 dog
just 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.