2011-01-11 5 views
41

Ich habe ein Formular, wo ich eine Menge Informationen in Rails sammle. Teil dieses Formulars sind Felder für einen neuen Benutzer zu registrieren. Da Devise Controller/Aktionen speziell zum Erstellen eines neuen Benutzers hat, weiß ich nicht, wie man einen Benutzer in einer völlig anderen Aktion programmiert, die auch einen anderen Datensatz erstellt. Ich kann das Benutzerregistrierungsformular wirklich nicht trennen. Ich kann nicht herausfinden, wie man einen Benutzer erstellt, und dann den Benutzer anmelden, wie ich leicht in Authlogic tun könnte.Wie erstelle ich manuell eine neue Benutzer- und Benutzersitzung in Devise?

Ich habe sowohl Authlogic und Devise verwendet und denke, dass jeder seine Stärken und Schwächen hat. Mit Devise gefällt mir, wie schnell es ist, mit einem neuen Projekt "loszulegen", aber das Customizing scheint ein Schmerz zu sein. Authlogic hatte vor einiger Zeit so viele Probleme mit Rails 3, dass ich zu Devise wechselte. Ich arbeite jetzt an einem neuen Projekt und fange von vorne an.

Also ich glaube, es gibt 2 mögliche Antworten auf diese Frage: (a) wie man das in Devise macht, oder (b) warum ich einfach zu Authlogic mit Rails 3 wechseln sollte.

+0

Ihre angenommene Antwort funktioniert sowohl für Devise als auch für Authlogic. –

Antwort

76

Sie können eine neue Devise Benutzer erstellen Sie einfach durch einen neuen Benutzermodells (siehe https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface)

@user = User.new(:email => '[email protected]', :password => 'password', :password_confirmation => 'password') 
@user.save 

in Ihrem neu erstellten Benutzer Um sich anzumelden, verwenden Sie sign_in @user

+0

Der exakt gleiche Code funktioniert auch für Authlogic (ich verwende Version 1.4.4.1). –

+0

wo ist die Dokumentation für diese .. wie in wissen, dass eine Funktion mit dem Namen sign_in existiert – codeAnand

+2

Sie können es in der "Testhelfer" Abschnitt in der Readme unter https://github.com/plataformatec/devise Genauer gesagt Sie können die Dokumentation hier sehen: http://rubydoc.info/github/plataformatec/devise/master/frames –

7

die neu erstellte Benutzer Speichern vor sign_in wird fehlschlagen, weil das Gerät noch nicht die erforderlichen Felder für das Benutzerobjekt ausgefüllt hat. David's Code wird also für die aktuelle Seite funktionieren, aber die nächste Seite wird den angemeldeten Benutzer nicht bekommen, da der Benutzer nur gespeichert wird, nachdem die Sitzung eingestellt wurde. Dies passiert, wenn ich Mongoid verwende, und ich weiß nicht, ob es ein Mongodb-spezifisches Problem ist.

Um dieses Problem zu beheben, habe ich eine sehr unvollkommene Lösung, um sign_in zweimal aufzurufen. Die erste sign_in speichert den Benutzer. Es funktioniert einfach, aber die Leute können es sicherlich verbessern.

@user = User.new(:email => '[email protected]', 
       :password => 'password', 
       :password_confirmation => 'password') 
# This will save the user in db with fields for devise 
sign_in @user 
# :bypass is set to ignore devise related callbacks and only save the 
# user into session. 
sign_in @user, :bypass => true 
+2

Darf ich fragen, ob das Problem immer noch auftritt, wenn Sie den Benutzer explizit vor dem Aufruf von sign_in speichern? Und wenn das nicht funktioniert, fügt einen Aufruf zum Neuladen des Benutzers nach dem Speichern aber vor sign_in? – m3z

4

Für neue Leute diese Frage zu sehen ...

Ein einfacher Weg, dies zu tun ist in Ihrem

config/routes.rb 

Sie eine Zeile wie die folgende haben sollte:

devise_for :users 

so müssen Sie nur ein Pfadpräfix hinzufügen, das das Gerät verwenden wird:

devise_for :users, :path_prefix =>'auth' 

Hoffe es hilft!

Verwandte Themen