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.