2012-04-29 6 views
5

Secondo l'episodio Rails Guides e this Railscasts, quando c'è un uno-a-molti associazione tra due oggetti (ad esempio Project e Task), siamo in grado di presentare più istanze di Task insieme al Project durante modulo di presentazione simile a questo:In che modo Rails raggruppa matrici di hash durante l'invio del modulo?

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

questo sarà il risultato più copie di un blocco HTML come questo in forma, uno per ogni attività:

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

La mia domanda è, come fa Rails capire quali

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

appartengono insieme, e li imballaggio in un elemento di un hash della matrice con conseguente params? È garantito che i browser debbano inviare i parametri del modulo nello stesso ordine in cui appaiono nella sorgente?

+1

Duh! Ho appena trovato la risposta [qui] (http://stackoverflow.com/questions/3300201/does-dom-order-determine-the-order-of-form-parameters-posted). Apparentemente questo è richiesto dallo standard. –

risposta

1

se si lavora con i dati diritta e desidera inviare di nuovo una matrice senza l'utilizzo di uno qualsiasi di questi @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 %> 

tuoi params dati dovrebbero tornare come questo

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

L'HTML creato renderebbe questa risposta applicabile a molte altre persone che la cercano anche, se si sentisse di aggiungerla :) – Kevin

+0

sì, l'HTML sarebbe di aiuto – 23tux

+0

Sì, si prega di fornire l'HTML. –

2

Sì, l'ordinazione è conservato così com'è, come @ k-everest auto-risposto come commento alla domanda originale.

Quelli che richiedono HTML, vedere guide su come viene analizzato l'attributo name.

Esempio di solito cattivo ordinazione:

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

E questo e 'rielaborato da Rails in questo:

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

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

La funzionalità è stata aggiunta in Rails' iniziale commettere , con il nome del metodo build_deep_hash. Per più storia, salta la guerra fiammeggiante/semantica e vai per l'ultimo post dalla fine qui: https://www.ruby-forum.com/topic/215584

Problemi correlati