tag rails form_with form_for form example collection_select ruby-on-rails arrays fields-for

ruby on rails - rails - usando una matriz con fields_for



select in ruby on rails (4)

¿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 current_user.

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 matriz que creé en mi controlador: @descriptionsFromCurrentUser

Esto también está dentro de "nested_form_for" de Ryan Bate

Cualquier puntero sería muy apreciado!

Adán


Encontré que esta es la forma más limpia

Si está trabajando con datos directos y desea devolver una matriz sin utilizar ninguno de estos @objetos

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

tus datos de params deberían regresar así

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


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

Si es una relación ActiveRecord :

class Person has_many :projects # this creates the projects_attributes= method accepts_nested_attributes_for :projects end

Si es una relación que no es 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 %>


Una adición a la respuesta de apenas conocida (no se pudo agregar como un comentario debido a 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) .


Docs for fields_for muestra claramente la forma de usar arrays:

O una colección para ser utilizada:

<%= 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.