2010-11-29 4 views
3

Je souhaite remplacer l'action RegistrationsContollers de Devise afin de créer un modèle UserProfile avec cet utilisateur.Comment ajouter un UserProfile à un utilisateur lorsque l'utilisateur s'inscrit? (Devise, Rails 3)

Ainsi, en suivant les directives du Readme Devise, je remplace l'action:

#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' } 

crée un Concevoir enregistrement dans la table users, mais comment puis-je associer un UserProfile avec ce dossier?

J'ai essayé la recherche de googles, mais je n'arrive pas à faire marcher ça! Toute aide est très appréciée.

(je suis maintenant en utilisant on Rails 1.1.5 Concevoir 3.0.3)

SOLVED:

Ajout d'une solution pour le bénéfice des autres:

#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 

Répondre

3

self fait référence à la contoller pas le modèle dans ce contexte.

De plus, le modèle utilisateur possède-t-il de nombreux UserProfiles? Sinon, si elles ne le font pas (ils ont seulement un), vous devez utiliser @user.build_user_profile, non @user.user_profiles.build

Je recommande également le faire au niveau du modèle, pas le niveau du contrôleur, en utilisant une fonction de rappel, comme before_create ou after_create, soit:

class User < AR 
    has_one :user_profile 

    after_create :build_profile 

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

Merci! cela fonctionne (@ user.build_user_profile). De plus, j'ai besoin de créer le profil dans le contrôleur (pas dans le modèle) car certaines entrées de l'utilisateur sont nécessaires au moment de l'inscription (comme l'adresse). – Zabba

+0

Si vous transmettez des données d'un autre modèle, dans ce cas le UserProfile, vous pouvez utiliser ': accepts_nested_attributes_for' dans le modèle User et' fields_for' dans le formulaire d'inscription, de cette façon vous pourrez tout faire En fait, au niveau du modèle, il vous faudrait créer le modèle associé implicitement sans avoir à écrire une ligne de code. – scaney

+0

Merci encore! Regardera dans ce – Zabba

Questions connexes