Rails Select Helper - Standardmäßig ausgewählter Wert, wie?

181

Hier ist ein Teil des Codes, den ich jetzt verwende:

<%= f.select :project_id, @project_select %>

Wie ändere ich es so, dass sein Standardwert dem params[:pid]beim Laden der Seite entspricht?

Totocaster
quelle
Ich bin nicht sicher, ob beim Laden der Seite ein Standardprojekt ausgewählt werden soll, ob: project_id nicht festgelegt ist oder ob Sie den Wert von select im Parameter-Hash als: pid zurückgeben möchten.
Tilendor

Antworten:

222

Dies sollte es tun:

<%= f.select :project_id, @project_select, :selected => params[:pid] %>
htanata
quelle
5
ohne params options_for_selectist der bessere weg. Es ist für jede Situation gut, auch für die Formularbearbeitung.
Adriano Resende
Hier ist der Schlüssel: Schauen Sie sich Ihre Funktion an (options_for_select () vs f.select. Denken Sie daran, dies sind verschiedene Funktionen.
FlyingV
126

Verwenden Sie das richtige Attribut der aktuellen Instanz (z. B. @work.project_id):

<%= f.select :project_id, options_for_select(..., @work.project_id) %>
Luchs
quelle
4
Dies ist die beste Antwort, da es auch funktioniert select_tag. Danke, es hat mir auch sehr geholfen.
Stephenmurdoch
7
Sie können auch versuchenoptions_for_select(..., f.object.project_id )
18augst
Vielen Dank! Alle anderen akzeptierten Antworten sagen nicht aus, wie sie über eine Variable ausgewählt werden sollen.
Mike Belanger
52

Schienen 3.0.9

select options_for_select([value1, value2, value3], default)
Cheng
quelle
Ich konnte diese Lösung nicht herausfinden, bis ich bemerkte, dass Ihre Klammer um das Wertearray VOR dem Komma, das Ihren Standardwert trennt, geschlossen wurde ... Ich habe diese Klammer hier verpasstvalue3], default
BigRon
33

Das Problem bei all diesen Antworten ist, dass das Feld auf den Standardwert gesetzt wird, auch wenn Sie versuchen, Ihren Datensatz zu bearbeiten.

Sie müssen den Standard auf Ihren vorhandenen Wert setzen und dann nur dann auf den tatsächlichen Standardwert setzen, wenn Sie keinen Wert haben. Wie so:

f.select :field, options_for_select(value_array, f.object.field || default_value)

Für alle, die mit f.object.fieldIhnen nicht vertraut sind, verwenden Sie immer f.objectIhren Feldnamen am Ende.

Mike Bethany
quelle
3
Das ist eine saubere Lösung, und wie bereits erwähnt, möchten Sie den Standardwert nur für Neu und den aktuellen Wert für Bearbeiten festlegen.
count0
1
Ich weiß, dass dies ein alter Thread ist, aber für jeden, der darauf select2stößt, funktioniert diese Antwort auch mit dem JS-Plugin. Funktioniert perfekt, wenn Sie Datensätze mit demselben Formular erstellen oder bearbeiten und select2 verwenden, insbesondere mit Platzhaltertext.
cdouble.bhuck
Ich denke, dies sollte diejenige sein, die als Antwort akzeptiert wird, wie @Mike Bethany sagte, dass alle anderen Antworten davon ausgehen, dass das Formular nur für neue Datensätze gerendert wird, wenn der Rails-Ansatz darin besteht, das Formular wiederzuverwenden. Kudos Mike
Erick Castrillo
22

Versuche dies:

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>
gavit
quelle
Mit Rails 4 hat das params[:pid]nicht funktioniert, aber Ihr Beispiel hat funktioniert.
Eric Wanchic
Dies hat bei mir funktioniert, da ich einen Teil von "f.fields_for" verwende. Danke.
Hugo
11

Wenn params [: pid] eine Zeichenfolge ist, die Sie wahrscheinlich verwenden müssen, wenn sie aus einem Formular stammt

params[:pid].to_i  

für das richtige Element in der Auswahlliste ausgewählt werden

danengle
quelle
Diese Antwort hat mir geholfen, mein Problem zu lokalisieren. Mein Auswahlfeld ist dynamisch und zieht eine Sammlung aus der Datenbank. Ich habe versucht, die Standardauswahl mit einem Titel zu füllen, nicht mit einer ID des Elements. Diese Antwort hat mir geholfen, dieses Problem zu erkennen, und nachdem ich meine @projectVariable mit einer ID aus der Datenbanktabelle anstelle eines Titels gefüllt hatte , wurde dieser Code auf der Rückseite des form.selectHelfers angehängt : selected: @projectDanke @danengle
Christopher Warrington
10

Ich habe eine Lösung gefunden und festgestellt, dass ich in RoR ziemlich unerfahren bin.

Fügen Sie in dem Controller, der die oben beschriebene Ansicht verwaltet, Folgendes hinzu:

@work.project_id = params[:pid] unless params[:pid].nil?
Totocaster
quelle
7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
jschorr
quelle
3

Ich konnte dies nicht zum Laufen bringen und stellte fest, dass ich das "ausgewählte" HTML-Attribut nicht nur dem richtigen <option>Tag, sondern auch dem <select>Tag hinzufügen musste . In den MDN-Dokumenten zum ausgewählten Attribut des Auswahl-Tags heißt es:

Ausgewählt - Das boolesche Attribut gibt an, dass zunächst eine bestimmte Option ausgewählt werden kann.

Das heißt, der Code sollte folgendermaßen aussehen:

f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}
Shelvacu
quelle
2
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>
swapnilp
quelle
0

Alternativ können Sie das Attribut: project_id im Controller festlegen, da das erste Argument von f.select dieses bestimmte Attribut abruft.

Promacuser
quelle
0

Wenn Sie versuchen, das f-Objekt zu drucken, werden Sie feststellen, dass es ein f.object gibt, das geprüft werden kann, um das ausgewählte Element zu erhalten (gilt für alle Schienen Version> 2.3).

logger.warn("f #{f.object.inspect}")

Verwenden Sie daher das folgende Skript, um die richtige Option zu erhalten:

:selected => f.object.your_field 
user2480972
quelle
0

Es ist bereits erklärt, werde versuchen, ein Beispiel zu geben

lass die Auswahlliste sein

select_list = { eligible: 1, ineligible: 0 }

Der folgende Code ergibt also

<%= f.select :to_vote, select_list %>

<select name="to_vote" id="to_vote">
  <option value="1">eligible</option>
  <option value="0">ineligible</option>
</select>

Um eine Option standardmäßig auszuwählen, müssen wir selected: value verwenden .

<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>

wenn can_vote? gibt true zurück, es setzt ausgewählt: 1, dann wird der erste Wert ausgewählt, andernfalls der zweite.

select name="driver[bca_aw_eligible]" id="driver_bca_aw_eligible">
  <option value="1">eligible</option>
  <option selected="selected" value="0">ineligible</option>
</select>

Wenn die Auswahloptionen nur eine Array-Liste anstelle von hast sind, ist die Auswahl nur der Wert, der ausgewählt werden soll, z. B. wenn

select_list = [ 'eligible', 'ineligible' ]

Jetzt wird das ausgewählte nur noch dauern

<%= f.select :to_vote, select_list, selected: 'ineligible' %>
Shiva Kumar
quelle
0

In der obigen Antwort von Mike Bethany wurde ein Standardwert festgelegt, als ein neuer Datensatz erstellt wurde, und der vom Benutzer ausgewählte Wert wird weiterhin im Bearbeitungsformular angezeigt. Ich habe jedoch eine Modellvalidierung hinzugefügt, mit der ich das Formular nicht senden konnte. Hier ist, was für mich funktioniert hat, um eine Modellvalidierung auf dem Feld zu haben und einen Standardwert sowie den Wert anzuzeigen, den der Benutzer im Bearbeitungsmodus ausgewählt hat.

  <div class="field">
    <%= f.label :project_id, 'my project id', class: "control-label" %><br>
    <% if @work.new_record? %>
      <%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], true), {}, required: true, class: "form-control" %><br>
    <% else %>
      <%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], @work.project_id), {}, required: true, class: "form-control" %><br>
    <% end %>
  </div>

Modell Bestätigung

  validates :project_id, presence: true
random_user_0891
quelle
-2

Dies sollte für Sie funktionieren. Es wird nur {:value => params[:pid] }an die Variable html_options übergeben.

<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>
Epochwolf
quelle
aber es wird nicht das passende Element in select: S
totocaster