2017-09-08 1 views
0

Ich baue ein Buchungssystem für Hotels und erstellt ein Preismodell, das vom Raummodell als verschachtelte Attribute akzeptiert wird. So weit, so gut, alles funktioniert einwandfrei. Da ich jedoch die Möglichkeit geben will, Preiserhöhungen einhalten zu können, benötige ich die Antworttage in meinem Preismodell. Also im Grunde, Preis: 50, 80, 120 zusammen mit Tagen: 1, 2, 3 ... ok, so jetzt meine Frage: Wie kann ich erreichen, dass die Tage automatisch in der Preistabelle gespeichert werden, so dass der Benutzer nur benötigt um den Preis für einen bestimmten Tag einzugeben.Rails verschachtelte Formulare: Index als Wert DB zuweisen

Ich habe versucht, es mit einem versteckten Feld arbeiten, die an die Tage Spalte reicht, aber ich konnte es nicht beheben. Da ich vom Controller 20 Inkremente generiert habe, habe ich es mit dem vom fields_for helper generierten Index versucht.

hier ist der relevante Teil meiner Controller:

def new 
    @room = current_user.rooms.build 
    20.times do 
    increment = @room.increments.build 
    end 
end 

Und hier ist meine Ansicht:

<%= form_for @room do |f| %> 
    #... 
    <%= f.fields_for :increments do |ff| %> 

     <%= ff.text_field :price, placeholder: 'price' %> 
     <%= ff.hidden_field :days, value: 'index' %> 

Haben Sie Ideen, wie ich erreichen, um den Wert zu bekommen konnte meine hidden_field auf 1 ... 20 in Bezug auf meinen Controller, der 20 Preisfelder generiert? Muss ich einen Formularhelfer schreiben und wenn ja, wie kann ich die Anzahl der Tage hinzufügen? Bin ich völlig falsch mit meinem Ansatz und es gibt einen offensichtlichen Weg, die gleiche Funktionalität zu erreichen? Jede Hilfe wird sehr geschätzt!

Antwort

1

einrichten Ich bin nicht ganz sicher, das ist, was Sie fragen, konnte aber Sie verwenden so etwas wie:

def new 
    @room = current_user.rooms.build 
    (1..20).each do |i| 
     @center.increments.build(days: i) 
    end 
end 

Oder das Gebäude in einer einzigen Zeile:

(1..20).each { |i| @center.increments.build(days: i) }

(Das Zuweisen von increment in der Schleife wird nirgendwo verwendet und wird für jedes Element der Schleife auf das letzte neue Inkrement aktualisiert; deshalb habe ich es entfernt)

bearbeiten. Was @oscar sagte ...

+1

mit '(1..20)' ist viel eleganter als '20.times' – max

0

Wollen Sie immer 20-fache Inkremente generieren?

gut diese Zeile 20.times do ist eine Schleife. Was würde ich tun, wird so etwas wie:

20.times do |t| 
increment = @center.increments.build(days: t+1) # t+1 since t starts in 0 
end 

Auf diese Weise können Sie die Tage am Gebäude der Instanzen

Verwandte Themen