2010-02-12 7 views
18

Tengo un usuario y un modelo de perfil. Un usuario puede tener muchos perfiles. Necesito acceder a una sola información de la sección de perfiles (a saber, el número de teléfono) en mi modelo de usuario durante el proceso de creación del usuario. Por lo tanto, estoy tratando de hacerlo a través del attr_accessible. Mi user.rb se ve así.Formas anidadas en rieles: acceso al atributo en la relación has_many

has_many :profiles 
attr_accessible :handle, :email, :password, :profile_mobile_number 
attr_accessor : :profile_mobile_number 

El problema que estoy enfrentando es que cuando trato de llamar al método getter profile_mobile_number en un método en el user.rb (el método es privado, aunque creo que no importa), I' m obteniendo un valor nulo Yo uso el siguiente en mi forma de usuarios/new.html.erb

Mi pregunta es ¿cuál es la forma correcta de hacer esto? Debería usar <% f.fields_for :profile do |ff| -%> o <% f.fields_for :profiles do |ff| -%> (observe que el segundo es plural). Cuando uso el plural: perfiles, ni siquiera veo los campos en el formulario. ¿Que me estoy perdiendo aqui? ¿Y cuál es el tiempo que debe usarse en el modelo user.rb? : profile_phone_number o: profiles_phone_number? Gracias.

+0

Como dije, estaba usando f.fields_for: profiles y los campos en el formulario no aparecían. Resulta que tuve que agregar @ user.profiles.build en el controlador. Pero ahora no puedo tener tanto attr_accessible como accept_nested_attributes_for en user.rb. El primero anula el último. Pero sí quiero tener attr_accesible para los atributos del modelo de usuario sin restringir el acceso a los atributos del modelo de perfil. ¿Algunas ideas? Gracias. –

Respuesta

16

Se podría hacer algo como lo siguiente:

<% form_for @user, :url => { :action => "update" } do |user_form| %> 
    ... 
    <% user_form.fields_for :profiles do |profiles_fields| %> 
    Phone Number: <%= profiles_fields.text_field :profile_mobile_number %> 
    <% end %> 
<% end %> 

Pero puesto que ya tiene una asociación, a continuación, puede ser que también utilice 'accepts_nested_attributes_for'

+6

Vale la pena mencionar que esto itera sobre los objetos asociados que ya existen. Sin embargo, no crea un nuevo registro vacío para completar. Utilice un ayudante para lo que agrega un nuevo registro si ninguno está en la asociación, por ejemplo, "def setup_profiles (user); user.profiles.build if user.profiles.blank? ||! User.profiles.map (&: new_record?) .any ?; user; end ", luego usa" form_for setup_profiles (@user) do ... " – hurikhan77

+1

@ ¡El comentario de hurikhan77 es crucial! Necesitas construir un nuevo objeto si no existen objetos asociados, de lo contrario, ¡nada aparece en tu formulario! – agmin

0

puede utilizar 'accepts_nested_attributes_for' para hacer esto; pero hay un pequeño truco en formas:

debe utilizar el singular, y llamar a fields_for para cada perfil, de esta manera:

<% form_for @user do |f| -%> 
<% @user.profiles.each do %> 
<% f.fields_for :profile_attributes, profile do |ff| -%> 
<% end %> 

en cuenta que es : profile_attributes, en lugar de sólo : perfil .

+3

Si es una asociación * belongs_to polymorphic *, debe definir un método * build_profile * en su modelo de Usuario. – nanda

Cuestiones relacionadas