2011-01-24 7 views
10

Ho cercato dappertutto, e ho trovato molte informazioni ... ma niente funziona per me e non capisco :(Overriding Il controller di registrazione di Devise per consentire un reindirizzamento dopo che un sign_up riuscito è stato eseguito

so che si supponga di ignorare il controllo di registrazione, in questo modo:

class Users::RegistrationsController < Devise::RegistrationsController 

def after_sign_up_path_for(resource) 
    authors_waiting_path 
end 

end 

Poi, seguendo l'esempio mostrato da Tony Amoyal http://www.tonyamoyal.com/2010/07/28/rails-authentication-with-devise-and-cancan-customizing-devise-controllers/, dovrei cambiare i miei percorsi per aggiornare l'accesso al nuovo controller :

devise_for :users, :controllers => { :registrations => "users/registrations" } do 
#get '/author/sign_up', :to => 'devise/registrations#new' 
#get '/client/sign_up', :to => 'devise/registrations#new' 
get '/author/sign_up', :to => 'users/registrations#new' 
get '/client/sign_up', :to => 'users/registrations#new'  
end 

Sì, ho qualcosa di un po 'strano qui, perché sto prendendo un percorso specifico per inviarli alla pagina di registrazione, questo mi permette di creare in modo efficace 2 scenario di registrazione. Ho commentato quello che avevo prima di aver scavalcato il controller di registrazione.

Anche con tutto questo e il mio authors_waiting_path essere un percorso valido, mantiene solo di andare al pagina di accesso dopo la registrazione :(

questo è davvero frustrante.

Alex

modifica : ho trovato anche questo sul wiki devise: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-after-registration-(sign-up)

Ma non ho idea di dove poter definire questo metodo crea dovrei ignorare il controller sessione ???

?

Edit 2:

ho messo un override di manichino del controller:

class Pouets::RegistrationsController < Devise::RegistrationsController 

    def after_sign_up_path_for(resource) 
     authors_waiting_path 
    end 

    def new 
     super 
    end 

    def create 
     puts "was here" 
     super 
    end 

    def edit 
     super 
    end 

    def update 
     super 
    end 

    def destroy 
     super 
    end 

    def cancel 
     super 
    end 

    end 

E non ho mai il "Was Here" nei miei ceppi .... ho davvero la sensazione che è totalmente ignorando l'override ... mi deve fare qualcosa di sbagliato :(

+0

Quale versione di binari stai usando? Quale versione di idea? –

+0

Rails 3.0.3 e devise 1.1.5, ultima versione di entrambi se sono corretto – Alex

risposta

9

Ok ... sono in grado di sostituire in modo che lei deve essere: 0

creare la cartella app/controllers/utenti

metti lì registrations_controller.rb con: (opzione con sessione - ma proverà sign_in e successivo reindirizzamento - potrebbe non essere un comportamento previsto per te). Inoltre questo è da concepire wiki e io non sono sicuro se funziona

class Users::RegistrationsController < Devise::RegistrationsController 

    def create 
    session["#{resource_name}_return_to"] = complete_path 
    super 
    end 

end 

applicazione riavvio (solo per garantire non ti fidi di niente)


Tutto sommato è necessario eseguire l'override Create Se vogliono reindirizzare solo gli utenti ... se si vuole definire alcune scenario più complesso si dovrebbe monkeypatch sign_in_and_redirect

così la vostra volontà di controllo si presenta come

class Users::RegistrationsController < Devise::RegistrationsController 
    # POST /resource/sign_up 
    def create 
    build_resource 

    if resource.save 
     set_flash_message :notice, :signed_up 

     #sign_in_and_redirect(resource_name, resource)\ 
     #this commented line is responsible for sign in and redirection 
     #change to something you want.. 
    else 
     clean_up_passwords(resource) 
     render_with_scope :new 
    end 
    end 
end 

seconda opzione prova a helper monkeypatch ....

module Devise 
    module Controllers 
    # Those helpers are convenience methods added to ApplicationController. 
    module Helpers 
     def sign_in_and_redirect(resource_or_scope, resource=nil, skip=false) 
     #intended behaviour for signups 
     end 
    end 
    end 
end 
+0

Scusa, ma penso che tu stia confondendo cosa voglio fare, voglio reindirizzare avec sign UP non accedi. Gestisco già la procedura di accesso, voglio solo indirizzare i miei utenti a una pagina di attesa mentre attivano la loro e-mail di conferma. E sì, hai ragione, il metodo per sovrascrivere sign_in path è nel controller principale dell'app, ma sfortunatamente il metodo di registrazione after :) A proposito, penso che non avrebbe senso avere quei metodi dappertutto – Alex

+0

Modifica: ho aggiunto il codice –

+0

eh mio male, sei sicuro che il tuo codice stia correttamente attaccando questo controller? Magari aggiungi un po 'di "Test" a def come nuovo e verifica se renderà corretto –

3

Ho provato la soluzione di cui sopra e, mentre funziona, la lettura di elaborare il codice, ho trovato che tutto è effettivamente necessario al fine di disconnessione utente appena registrato e reindirizzare è:

  1. a aggiungi is_approved o simile alla tabella utente e
  2. per aggiungere active_for_authentication? metodo nel modello User

Codice:

class User < ActiveRecord::Base 

    # ... some code 

    def active_for_authentication? 
    super && is_approved 
    end 
end 

era un po 'difficile da trovare quando ne avevo bisogno, ma questo è tutto. In realtà sto scrivendo qui nel caso in cui qualcun altro ne abbia bisogno.

+0

Molto utile, grazie per averlo menzionato. [Documenti] (http://rubydoc.info/github/plataformatec/devise/master/Devise/Models/Authenticatable) – Hana

Problemi correlati