2012-04-29 9 views
5

Según el episodio Rails Guides y this Railscasts, cuando hay un asociación uno-a-muchos entre dos objetos (por ejemplo Project y Task), se puede presentar varias instancias de Task junto con el Project durante el envío de forma similar a esto:¿Cómo Rails agrupa las matrices de valores hash durante el envío del formulario?

<% form_for :project, :url => projects_path do |f| %> 
    <p> 
    Name: <%= f.text_field :name %> 
    </p> 
    <% for task in @project.tasks %> 
    <% fields_for "project[task_attributes][]", task do |task_form| %> 
     <p> 
     Task Name: <%= task_form.text_field :name %> 
    Task Duration: <%= task_form.text_field :duration %> 
     </p> 
    <% end %> 
    <% end %> 
    <p><%= submit_tag "Create Project" %></p> 
<% end %> 

esto dará como resultado múltiples copias de un bloque HTML como este en el formulario, uno para cada tarea:

<p> 
    Task Name: <input name="project[task_attributes][name]"> 
    Task Duration: <input name="project[task_attributes][duration]"> 
</p> 

Mi pregunta es, ¿cómo rieles entender qué

(project[task_attributes][name], project[task_attributes][duration]) 

pertenecen juntos, y empaquetarlos en un elemento hash de la matriz resultante en params? ¿Se garantiza que los navegadores deben enviar los parámetros del formulario en el mismo orden en el que aparecen en la fuente?

+1

Duh! Acabo de encontrar la respuesta [aquí] (http://stackoverflow.com/questions/3300201/does-dom-order-determine-the-order-of-form-parameters-posted). Aparentemente esto es requerido por la norma. –

Respuesta

1

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"} 
    ] 
} 
+0

El código HTML creado haría que esta respuesta fuera aplicable a muchas otras personas que la buscaban, si le apetecía agregarla :) – Kevin

+0

sí, el HTML ayudaría a – 23tux

+0

Sí, indique el código HTML. –

2

Sí, es pedido retenido tal como está, como @ k-everest auto-respondida como un comentario a la pregunta original.

Aquellos que piden HTML, ver el guide sobre cómo se analiza el atributo name.

Ejemplo de lo general mal el pedido:

cart[items][][id]=5 
cart[items][][id]=6 
cart[items][][name]=i1 
cart[items][][name]=i2 

Y que obtiene analizado por los carriles en esto:

{ "cart"=> {"items"=> [ 
         {"id"=>"5"}, 
         {"id"=>"6", "name"=>"i1"}, 
         {"name"=>"i2"} 
         ]}} 

fuente Ejemplo: https://spin.atomicobject.com/2012/07/11/get-and-post-parameter-parsing-in-rails-2/

La función se añadió en Rails' inicial cometer , con el nombre de método build_deep_hash. Para obtener más información, omita la guerra de flamas/semántica y elija la última publicación desde el final aquí: https://www.ruby-forum.com/topic/215584

Cuestiones relacionadas