2009-08-08 10 views
0

Ich hoffe meine Frage ist nachvollziehbar, sonst bin ich froh zu klären.Tricky Ruby auf Schienen Problem. Gibt es eine einfache Lösung?

Wir haben dieses Sportereignis vor uns, und ich habe das Vergnügen, die Leute zu registrieren. :)

Fakten:

  • kann man ein Team von 5-10 Personen haben.
  • Müssen Sie wissen, in welcher Reihenfolge die Leute anfangen.
  • Wissen, wer der Teamleiter ist.

Ich habe eine Form, in der folgenden Art:

  1. o [____Write first name here___]< --- Dies ist ein Textfeld
  2. o [____Write second name here__]
  3. o [___________ ... ____________]
  4. ...

Das "o" ist ein Radio-Button, mit dem der Teamleiter ausgewählt wird.

Ich habe ein Modell Person und ein Modell -Team. Jedes Team hat eine leader_id (das ist eine der Personen-IDs). Außerdem jedes Team :has_many Personen.

In der Steuerung Ich habe

def create 
    @team = Team.new(params[:team]) 
    @team.save #just assume there are no errors 
end 

Nach Ansicht I (für die Radio-Buttons) haben:

<input id="team_leader_id_**????**" 
     name="team[leader_id]" 
     type="radio" 
     value="**????**" 
/> 

<input id="team_leader_id_**????**" 
     name="team[leader_id]" 
     type="radio" 
     value="**????**" 
/>  
# etc. 

Meine Frage: Was soll ich bei **????** setzen?

Ich kenne die IDs der Personen noch nicht, da sie nicht erstellt wurden. Ich muss dort eine Meta-ID anlegen, welcher Ruby auf Rails erkennt und alles korrekt verlinkt?

Sie müssen den Rest nicht lesen (es den Hack beschreibt Ich verwende)

Wie gesagt, im Moment habe ich eine hässliche Hack so mache: zuerst die Teams speichern (ohne Erzeugung ein Führer), dann das gleiche Team aus der DB holen, seine Menschen bekommen, und die erste Person den Wert von

params[:team][:leader_id]. 

Schließlich Speicher dieser Person ID im Bereich der leader_id des Teams finden. |

Aber dieser Code ist ineffizient, riesig und fehlerhaft, dass ich vermute, dass es einen einfacheren Weg gibt.

Antwort

2

Die Funkgeräte sollten den gleichen Namen haben, d.h.

<input id="team_persons_attributes_0_leader_id" 
     name="team[persons_attributes][leader_id]" 
     type="radio" 
     value="0" 
/> 
<input id="team_persons_attributes_1_leader_id" 
     name="team[persons_attributes][leader_id]" 
     type="radio" 
     value="1" 
/> 
<input id="team_persons_attributes_2_leader_id" 
     name="team[persons_attributes][leader_id]" 
     type="radio" 
     value="2" 
/> 

Auf diese Weise kann es nur eine ausgewählt werden (über den Browser interner Radio-Button-Mechanismus) und params[:team][:persons_attributes][:leader_id] einen Index zu params[:team][:persons] enthält, die den Name des Führers sein werden.

die ID

team = Team.create(params[:team]) 
params[:team][:persons].each_with_index{|name, idx| 
    person = Persons.create(:name => name) 
    #assuming no errors 
    team.leader_id = person.id if params[:team][:persons_attributes][:leader_id] == idx 
} 
+0

danke. Ich habe meinen Beitrag aktualisiert. Dummer Fehler, Problem bleibt. :) – jacob

+0

nur um zu verdeutlichen: ruby ​​on rails setzt team.leader_id auf was auch immer ich im Attribut "value" angegeben habe. Bei Ihrem Beispiel könnte das zum Beispiel "1" sein, wenn ich den zweiten wähle. Aber ich möchte wirklich die ID der Person in diesem Feld haben, und nicht 1. – jacob

+0

die ID kann mit meinem Beispiel von params [: team] [: persons] [params [: team] [: persons_attributes] [: leader_id]] [: id] - ich werde meine Antwort aktualisieren, um sie ausführlicher zu erklären. –

1

Es scheint zu erhalten, als ob Sie eine Anzahl von Benutzern in einem Rutsch mit einem von ihnen markiert als Teamleiter einreichen. In diesem Fall könnte man so etwas konstruieren: (mit verschachtelten Attributen)

<%= radio_button_tag "[team][leader]","[1]" %> 
<%= radio_button_tag "[team][leader]","[2]" %>> 

dann im Controller erstellen, um die Menschen, dann einfach die ID des einen als Führer für das Team Rekord markiert nachzuschlagen.

+0

danke für deine antwort. – jacob

Verwandte Themen