2012-04-12 22 views
12

Ich möchte ein Feld speziell festlegen, wenn ein Benutzer erstellt wird. Ich habeRegistrierung überschreiben Methode erstellen

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

I Kontrollkästchen haben, dass die Tags Parameter übergeben, und ich habe in den Server-Logs überprüft, dass die Tags Parameter übergeben wird. Wenn ich jedoch @ user.tag_list in der Konsole anrufe, erhalte ich nur eine leere Antwort [].

Ich fühle, dass das Problem in meiner Manipulation der create Methode der Erfindung liegt. Ich habe @user nicht explizit festgelegt, bin mir aber nicht sicher, wie ich es mit Devise einstellen soll. Kann jemand ein spezifisches Feld bei der Verwendung von Devise festlegen?

+2

Planetpluto, sollten Sie Ihre eigene Antwort für die Verwendung von 'resource' hinzufügen und als Antwort markieren, wie Sie Puneeth in Ihrem Kommentar erwähnt. Das ist eine viel bessere und einfachere Lösung. – Jeff

Antwort

39

Für die Zukunft für alle berufen, die diese während für wie Methoden ersinnen außer Kraft zu setzen Suche findet, die meisten der ersinnen Methoden akzeptieren einen Block, so etwas wie dies sollte auch funktionieren:

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

es hat nicht funktioniert für mich (Rails 3.2), ich habe auf alt eine super dann meine anweisungen – OWZY

+0

Arbeitete auf Rails 5.1. –

10

Statt super der Verwendung der Devise :: RegistrationsController der Aktion erstellen, ersetzen Sie es mit dem 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

Danke, das funktioniert perfekt. Ich werde versuchen, super und darunter, anstatt @ user.tag_list resource.tag_list zu verwenden, um zu sehen, ob das auch funktioniert. – Vasseurth

+0

Entschuldigung dafür, dass wir einen so alten Thread noch einmal besucht haben, aber Puneeth, können Sie erklären, warum es besser wäre, den eigentlichen Code von Devises Create-Methode zu verwenden, anstatt "Super" zu verwenden? – jeffdill2

+0

@streetlogics beantworten diese Frage besser. Das Gerät create super hat diese Zeile "yield resource wenn block_given?" Das wird den in seinem Beispiel hinzugefügten Block auswerten. – blnc

6

Wenn Sie nicht den gesamten Code der create-Methode neu zu schreiben möchten, können Sie einfach das Ressourcenvariable innerhalb des Prote gesetzt cted Methode : build_resource von Devise :: RegistrationsController, die vor dem Speichern der Ressource aufgerufen wird.

protected 

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

Das funktionierte für mich in Rails 4 mit Devise 3.5. Vielen Dank!!!!!! – cman77

+1

Hatte ein Problem mit der akzeptierten Antwort, die meine Validierung zweimal ausgelöst hat, und dieser Ansatz brachte einen neuen Ansatz für meine Implementierung, danke. – ollaollu

Verwandte Themen