2010-11-29 8 views
33

Je veux élargir la forme d'inscription de mon installation de conception. J'ai créé un modèle de profil et me demande maintenant, comment puis-je ajouter des données spécifiques du formulaire à ce modèle. Où se trouve le UserController de l'appareil?Modèle de profil pour les utilisateurs de Devise?

merci d'avance!

+8

Pourquoi créer un autre profil de modèle? Pourquoi ne pas tout avoir dans l'utilisateur. – AnApprentice

+1

@ Séparation d'AnApprentice des préoccupations. Vous souhaitez disposer d'un modèle de compte ou d'utilisateur pour tout ce qui concerne le compte d'utilisateur et le modèle de profil pour les données de profil personnelles. Vous devrez peut-être également autoriser les utilisateurs à avoir un profil très complet et vous ne souhaitez pas créer de table 50+. –

Répondre

43

Module :registerable du modèle User (lire https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface) En supposant que vous avez un modèle utilisateur avec une association Profil has_one , vous devez simplement autoriser les attributs imbriqués dans l'utilisateur et modifier la vue d'enregistrement de votre appareil. Exécutez la commande 'rails generate devise: views' puis modifiez la vue d'inscription de legs # new.html.erb comme indiqué ci-dessous en utilisant l'assistant fields_for form pour que votre formulaire d'inscription mette à jour votre modèle Profile avec votre modèle User.

<div class="register"> 
    <h1>Sign up</h1> 

    <% resource.build_profile %> 
    <%= form_for(resource, :as => resource_name, 
         :url => registration_path(resource_name)) do |f| %> 
    <%= devise_error_messages! %> 

    <h2><%= f.label :email %></h2> 
    <p><%= f.text_field :email %></p> 

    <h2><%= f.label :password %></h2> 
    <p><%= f.password_field :password %></p> 

    <h2><%= f.label :password_confirmation %></h2> 
    <p><%= f.password_field :password_confirmation %></p> 

    <%= f.fields_for :profile do |profile_form| %> 
     <h2><%= profile_form.label :first_name %></h2> 
     <p><%= profile_form.text_field :first_name %></p> 

     <h2><%= profile_form.label :last_name %></h2> 
     <p><%= profile_form.text_field :last_name %></p> 
    <% end %> 

    <p><%= f.submit "Sign up" %></p> 

    <br/> 
    <%= render :partial => "devise/shared/links" %> 
    <% end %> 
</div> 

Et dans votre modèle utilisateur:

class User < ActiveRecord::Base 
    ... 
    attr_accessible :email, :password, :password_confirmation, :remember_me, :profile_attributes 
    has_one :profile 
    accepts_nested_attributes_for :profile 
    ... 
end 
+0

gentil. Merci beaucoup! – Tronic

+3

solution merveilleusement simple, merci! Juste une petite considération: ne trouvez-vous pas un peu sale pour construire le profil dans la vue? C'est juste parce que nous ne pouvons pas éditer facilement le contrôleur de soupape Devise ou est-ce que je suis trop difficile? :-) –

+2

Non, vous n'êtes pas trop difficile. :) Je suis d'accord avec vous, normalement vous créez une nouvelle instance de modèle dans le contrôleur, pas dans la vue.Mais comme vous l'avez mentionné, parce que le contrôleur Devise devrait être mis à jour, la solution la plus simple et la plus simple dans ce cas particulier est de le faire dans la vue. – mbreining

4

Ce n'est pas très clair à partir de votre question, mais je suppose que votre modèle Devise est User et que vous avez créé un autre modèle Profile qui appartient à l'utilisateur. Vous devrez créer un contrôleur pour votre modèle utilisateur avec rails g controller users.

Vous devrez également générer les vues pour vos utilisateurs avec rails generate devise:views afin que l'utilisateur puisse ajouter des informations de profil lors de la création de son compte. De là, c'est comme n'importe quel autre modèle: créez une instance d'utilisateur et de profil et liez les deux. Ensuite, dans les contrôleurs, utilisez current_user.profile pour accéder au profil de l'utilisateur actuel.

Notez que si vous allez gérer les utilisateurs de cette façon, vous devrez supprimer le

8

Pour compléter la réponse de mbreining, dans 4.x Rails vous devez utiliser strong parameters pour permettre des attributs imbriqués pour être stockés. Créer une sous-classe de contrôleur d'enregistrement:

RegistrationsController < Devise::RegistrationsController 

    def sign_up_params 
    devise_parameter_sanitizer.sanitize(:sign_up) 
    params.require(:user).permit(:email, :password, profile_attributes: [:first_name, :last_name]) 
    end 
end 
2

Une autre façon afin de ne pas mettre des ressources de construction dans la vue est de réécrire le contrôleur DEVISE et pour être exact, la nouvelle méthode, tout u besoin de faire est de changer pour :

def new 
    build_resource({}) 
    resource.build_profile 
    respond_with self.resource 
end 
Questions connexes