2010-11-29 4 views
3

Ich möchte Devise's RegistrationsContollers 'Aktion erstellen, so dass wenn ein Benutzer sich anmeldet, kann ich ein UserProfile Modell mit diesem Benutzer verknüpfen.Wie füge ich ein Benutzerprofil zu einem Benutzer hinzu, wenn sich der Benutzer anmeldet? (Devise, Rails 3)

So, nach den Richtlinien in der Devise Readme, überschreiben ich die Aktion:

#File app/controllers/registrations_controller.rb:  
class Users::RegistrationsController < Devise::RegistrationsController 
    def create 
    # some code here.. 
    self.user_profiles.build #Error (no method `user_profiles`) 
    current_user.user_profiles.build #Error (current_user is nil) 
    some other way??? 
    end 
end 

#File routes.rb: 
devise_for :users, :controllers => { :registrations => 'users/registrations' } 

Devise einen Datensatz in der users Tabelle erstellt, aber wie verknüpfe ich eine UserProfile mit diesem Eintrag?

Ich habe versucht zu googeln, aber ich kann einfach nicht zur Arbeit kommen! Jede Hilfe wird sehr geschätzt.

(Ich verwende jetzt Devise 1.1.5 on Rails 3.0.3)

GELÖST:

Lösung Hinzufügen zum Nutzen anderer:

#File app/controllers/registrations_controller.rb:  
class Users::RegistrationsController < Devise::RegistrationsController 
    def create 
    super 
    @user.build_user_profile 
    @user.user_profile.some_data = 'abcd' 
    @user.save! 
    end 
end 

Antwort

3

self bezieht sich auf die contoller nicht das Modell in diesem Zusammenhang.

Hat das Benutzermodell auch viele UserProfiles? Andernfalls, wenn sie dies nicht tun (dh sie nur eine haben), dann sollten Sie @user.build_user_profile verwenden, nicht @user.user_profiles.build

Ich würde auch auf Modellebene tun dies empfehlen, nicht der Controller-Ebene, einen Rückruf verwenden wie before_create oder after_create, dh:

class User < AR 
    has_one :user_profile 

    after_create :build_profile 

    def build_profile 
     self.build_user_profile 
     ... 
    end 
end 
+0

Danke! das funktioniert (@ user.build_user_profile). Außerdem muss ich das Profil im Controller erstellen (nicht im Modell), da einige Eingaben vom Benutzer zur Anmeldezeit (z. B. Adresse) benötigt werden. – Zabba

+0

Wenn Sie Daten von einem anderen Modell, in diesem Fall dem UserProfile, übergeben, können Sie mit ': access_nested_attributes_for' im Benutzermodell und' fields_for' im Anmeldeformular auf diese Weise alles tun Sie benötigen auf der Modellebene tatsächlich die Möglichkeit, das zugehörige Modell implizit zu erstellen, ohne eine Codezeile schreiben zu müssen. – scaney

+0

Danke nochmal! Werde das untersuchen – Zabba

Verwandte Themen