2015-06-07 8 views
6

Voglio eseguire qualche funzione prima di qualsiasi azione del controller per verificare se l'utente è connesso. Sto usando devise in modo che possa usare is_signed_in ?, ma devo mettere se altrimenti condizione per ogni metodo nel controller.Verifica se l'utente ha effettuato l'accesso prima di qualsiasi azione in Rails

Quello che voglio è avere qualcosa di simile:

#some_controller.rb 
 
before_action :is_signed_in? 
 

 
def is_signed_in? 
 
    if !user_signed_in? 
 
     redirect_to new_user_session_path 
 
    else 
 
     ..proceed to the action intended to call 
 
    end 
 
end
in modo che io voglio che questo metodo di eseguire prima di ogni azione (o un insieme di azioni) e reindirizzare ad accedere se falsa, o lascia che quell'azione sia eseguita se è vera.

risposta

12

Devise è rilasciata con alcuni utili built-in aiutanti.

Nel tuo caso, quello che ti interessa è authenticate_user!. Dai un'occhiata a controller filters and helpers nella documentazione di Devise.

È possibile filtrare le azioni nel controller con questo metodo per garantire che solo gli utenti connessi possano elaborare una determinata azione o tutte le azioni in un controller, altrimenti se l'utente non ha effettuato l'accesso, viene reindirizzato alla pagina di accesso .

before_action :authenticate_user! 

before_action :authenticate_user!, only: [:show] 
1

Stai utilizzando devise? È possibile utilizzare il filtro esistente:

class SomeController < ApplicationController 
    before_filter :authenticate_user! 
    ... 
    end 

caso contrario, creare il filtro in un controllore di applicazione e aggiungerlo ai controller necessari:

class SomeController < ApplicationController 
    before_filter :my_auth_filter 
    ... 
    end 
2

Se si desidera verificare se l'utente è firmato per ogni azione in l'applicazione, devi mettere il filtro nel controller dell'applicazione. Puoi farlo anche per un controller specifico.

È possibile utilizzare il metodo devise:

class SomeController < ApplicationController 
    before_action :authenticate_user! 
    ... 
end 

È possibile creare il proprio filtro anche:

class SomeController < ApplicationController 
    before_action :my_authentication 
    ... 
    def my_authentication 
    if user_signed_in? 
     # do something ... 
    else 
     # do something else ... 
    end 
    end 
end 
8

È inoltre possibile creare il proprio metodo di supporto.

Nella tua users_controller.rb, creare un filtro before_action

class UsersController < ApplicationController 
    before_action :logged_in_user 
    ... 
end 

e nella vostra session_helper.rb

module SessionHelper 
    # Returns true if the user is logged in, false otherwise. 
    def logged_in? 
     !current_user.nil? 
    end 

    # Confirms a logged-in user. 
    def logged_in_user 
     unless logged_in? 
     flash[:danger] = "Please log in." 
     redirect_to login_url 
     end 
    end 

end 
+0

Bump per l'utilizzo della parola chiave 'unless'. Nessun motivo per usare la frangia e sacrificare la leggibilità. –

0

È possibile aggiungere questo metodo per il vostro ApplicationController

def user_is_logged_in 
    if !session[:current_user] 
     redirect_to login_path 
    end 
end 

utilizzare prima invocare qualsiasi Azioni. Ad esempio,

class AdminsController < ApplicationController 
    before_action :user_is_logged_in 
    ... 
end 
Problemi correlati