2012-06-26 11 views
15

¿Cómo puedo iterar a través de una matriz de objetos (todos del mismo modelo) usando fields_for? La matriz contiene objetos creados por el usuario_actual.usando una matriz con fields_for

Actualmente tengo:

<%= f.fields_for :descriptionsbyuser do |description_form| %> 
<p class="fields"> 
    <%= description_form.text_area :entry, :rows => 3 %> 
    <%= description_form.link_to_remove "Remove this description" %> 
    <%= description_form.hidden_field :user_id, :value => current_user.id %> 
</p> 
<% end %> 

Pero quiero reemplazar el: descriptionsbyuser con una serie que creé en mi regulador - @descriptionsFromCurrentUser

Este es también el interior de Ryan Bate de "nested_form_for"

¡Cualquier puntero sería muy apreciado!

Adam

Respuesta

18

Docs for fields_for que muestra claramente la manera de usar las matrices:

o una colección a utilizar:

<%= form_for @person do |person_form| %> 
    ... 
    <%= person_form.fields_for :projects, @active_projects do |project_fields| %> 
    Name: <%= project_fields.text_field :name %> 
    <% end %> 
    ... 
<% end %> 

@active_projects aquí es su matriz.

+0

gracias jdoe! ¡Justo lo que necesitaba! – adamteale

+11

Esto no funciona para mí. Obtengo algo como 'método indefinido' nombre 'para # '. – Ajedi32

+3

@ Ajedi32 et al => Su modelo necesita implementar un setter para los atributos de la colección. Ver respuesta de apenas conocido. – barelyknown

22

Para utilizar una colección para fields_for y hacer que funcione de la forma esperada, el modelo necesita aceptar atributos anidados para la colección. Si la colección es una relación uno a varios ActiveRecord, use la macro de clase accepts_nested_attributes_for. Si la colección no es una relación uno a varios ActiveRecord, deberá implementar un captador de colección y un setter de atributos de colección.

Si se trata de una relación ActiveRecord:

class Person 
    has_many :projects 

    # this creates the projects_attributes= method 
    accepts_nested_attributes_for :projects 
end 

Si se trata de una relación no ActiveRecord:

class Person 
    def projects 
    ... 
    end 

    def projects_attributes=(attributes) 
    ... 
    end 
end 

De cualquier manera, la forma es la misma:

<%= form_for @person do |f| %> 
    ... 
    <%= f.fields_for :projects, @active_projects do |f| %> 
    Name: <%= f.text_field :name %> 
    <% end %> 
    ... 
<% end %> 
+0

+1 para detalles de implementación que no sean ActiveRecord.De alguna manera, mi ojo se negó a ver lo que se explicaba claramente en los documentos ... –

5

He encontrado que esta es la forma más limpia

si se está trabajando con los datos recta y quiere devolver una matriz sin necesidad de utilizar cualquiera de estos @objects

<%= form_for :team do |t| %> 
    <%= t.fields_for 'people[]', [] do |p| %> 
    First Name: <%= p.text_field :first_name %> 
    Last Name: <%= p.text_field :last_name %> 
    <% end %> 
<% end %> 

sus parametros datos deben volver como esto

"team" => { 
    "people" => [ 
    {"first_name" => "Michael", "last_name" => "Jordan"}, 
    {"first_name" => "Steve", "last_name" => "Jobs"}, 
    {"first_name" => "Barack", "last_name" => "Obama"} 
    ] 
} 
5

Una adición a la respuesta de barelyknown (no fue posible agregar como comentario debido a los puntos de reputación) -

Para el caso de registro no activo, también tuve que definir persisted? en mi clase además de *_attributes=(attributes).

Cuestiones relacionadas