2010-11-29 34 views
33

quiero ampliar la forma de registro de mi instalación de diseño. Creé un modelo de perfil y me pregunto ahora, ¿cómo puedo agregar datos específicos del formulario a este modelo? ¿Dónde está ubicado el UserController of idee?Modelo de perfil para usuarios de Devise?

gracias de antemano!

+8

¿por qué crear otro perfil de modelo? ¿Por qué no simplemente tener todo en usuario? – AnApprentice

+1

@AnApprentice separación de preocupaciones. Desea tener un modelo de Cuenta o Usuario para todo lo relacionado con la cuenta de usuario y el Modelo de perfil para datos de perfil personal. También es posible que deba permitir que los usuarios tengan un perfil muy completo y no desea crear una tabla de más de 50 campos. –

Respuesta

43

Asumiendo que tiene un modelo de usuario con una asociación has_one Perfil , solo necesita permitir atributos anidados en Usuario y modificar su vista de registro de diseño. Ejecute el comando 'rails generate idee: views' y luego modifique la visualización de idee registrations # new.html.erb como se muestra a continuación usando fields_for form helper para que su formulario de suscripción actualice su modelo de perfil junto con su modelo de usuario.

<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> 

Y en su modelo de usuario:

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

nice one. ¡muchas gracias! – Tronic

+3

solución maravillosamente simple, ¡gracias! Solo un poco de consideración: ¿no te parece un poco sucio para construir el perfil en la vista? Es solo porque no podemos editar el controlador de suspiro de Devise fácilmente o puedo ser demasiado quisquilloso? :-) –

+2

No, no eres demasiado quisquilloso. :) Estoy de acuerdo contigo, normalmente crearías una nueva instancia de modelo en el controlador, no en la vista.Pero como mencionó, debido a que el controlador Devise necesitaría ser actualizado, la solución más fácil y simple en este caso particular es hacer esto en la vista. – mbreining

4

No está muy claro de su pregunta, pero supongo que su modelo Devise es User y creó otro modelo Profile que pertenece al usuario.

Deberá crear un controlador para su modelo de usuario con rails g controller users.

También deberá generar las vistas para sus usuarios con rails generate devise:views para que el usuario pueda agregar información de perfil cuando cree su cuenta.

A partir de ahí, es como cualquier otro modelo: crear una instancia de usuario y perfil y vincular los dos. Luego, en los controladores, use current_user.profile para acceder al perfil del usuario actual.

Tenga en cuenta que si se va a administrar a los usuarios de esta manera, tendrá que retirar el módulo :registerable del modelo User (también leer https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface)

8

Para complementar la respuesta de mbreining, en Rails 4.x tendrá que utilizar strong parameters para permitir atributos anidados para ser almacenados. Crear una subclase control de registro:

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

Otra forma con el fin de no poner los recursos edificio en la vista es para reescribir el controlador legado y para ser más exactos, el nuevo método, todo u necesidad de hacer es cambiarlo a :

def new 
    build_resource({}) 
    resource.build_profile 
    respond_with self.resource 
end 
Cuestiones relacionadas