2012-04-12 16 views
12

Desidero impostare in modo specifico un campo quando viene creato un utente. HoOverriding Devise Registration Crea metodo

class RegistrationsController < Devise::RegistrationsController 
    def create 
    super 
    @user.tag_list = params[:tags] 
    end 
end 

Ho caselle di controllo che passano il parametro tag e ho verificato nei registri del server che il parametro tag viene passato. Tuttavia, quando chiamo @ user.tag_list nella console ottengo solo una risposta vuota [].

Ritengo che il problema risieda nella mia manipolazione del metodo di creazione del dispositivo. Non ho impostato esplicitamente @user ovunque ma non sono sicuro di come impostarlo utilizzando Devise. Qualcuno sa come impostare un campo specifico quando si usa Idea?

+2

Planetpluto, è necessario aggiungere la propria risposta per l'utilizzo di 'risorsa' e contrassegnarla come risposta, come si è accennato nel commento Puneeth. Questa è una soluzione molto migliore e più semplice. – Jeff

risposta

39

Per riferimento futuro per chi trova questo durante la ricerca di come eseguire l'override ideare metodi, la maggior parte del escogitare metodi accettano un blocco, in modo da qualcosa come questo dovrebbe funzionare così:

class RegistrationsController < Devise::RegistrationsController 
    def create 
    super do 
     resource.tag_list = params[:tags] 
     resource.save 
    end 
    end 
end 
+0

non ha funzionato per me (Rails 3.2), ho passato alla vecchia super poi alle mie istruzioni – OWZY

+0

Worked on Rails 5.1. –

10

Invece di usare super per invocare un'azione creare il Devise :: del RegistrationsController, sostituirlo con il actual code of Devise::RegistrationsController's create method

build_resource 
resource.tag_list = params[:tags] #******** here resource is user 
if resource.save 
    if resource.active_for_authentication? 
    set_flash_message :notice, :signed_up if is_navigational_format? 
    sign_in(resource_name, resource) 
    respond_with resource, :location => after_sign_up_path_for(resource) 
    else 
    set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format? 
    expire_session_data_after_sign_in! 
    respond_with resource, :location => after_inactive_sign_up_path_for(resource) 
    end 
else 
    clean_up_passwords resource 
    respond_with resource 
end 
+1

Grazie, funziona perfettamente. Proverò a utilizzare super e sotto di esso, anziché @ user.tag_list resource.tag_list per vedere se funziona anche quello. – Vasseurth

+0

Ci scusiamo per aver rivisitato un thread così vecchio, ma Puneeth, puoi spiegare perché sarebbe meglio inserire il codice effettivo dal metodo di creazione di Devise, invece di usare 'super'? – jeffdill2

+0

@streetlogics risponde meglio risponde a questa domanda. L'idea di creare super ha questa linea "yield resource if block_given?" che valuterà il blocco aggiunto nel suo esempio. – blnc

6

Se non si desidera riscrivere l'intero codice del metodo create, si può semplicemente impostare la variabile di risorse all'interno della prote metodo : build_resource di Devise :: RegistrationsController, chiamato prima che la risorsa venga salvata.

protected 

# Called before resource.save 
def build_resource(hash=nil) 
    super(hash) 
    resource.tag_list = params[:tags] 
end 
+0

Questo ha funzionato per me in Rails 4 con Devise 3.5. Grazie!!!!!! – cman77

+1

Si è verificato un problema con la risposta accettata che ha innescato due volte la mia convalida e questo approccio ha portato un nuovo approccio alla mia implementazione, grazie. – ollaollu

Problemi correlati