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?
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?
Antworten:
Dies sollte es tun:
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
options_for_select
ist der bessere weg. Es ist für jede Situation gut, auch für die Formularbearbeitung.
Verwenden Sie das richtige Attribut der aktuellen Instanz (z. B. @work.project_id
):
<%= f.select :project_id, options_for_select(..., @work.project_id) %>
select_tag
. Danke, es hat mir auch sehr geholfen.
options_for_select(..., f.object.project_id )
Schienen 3.0.9
select options_for_select([value1, value2, value3], default)
value3], default
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.field
Ihnen nicht vertraut sind, verwenden Sie immer f.object
Ihren Feldnamen am Ende.
select2
stöß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.
Versuche dies:
<%= f.select :project_id, @project_select, :selected => f.object.project_id %>
params[:pid]
nicht funktioniert, aber Ihr Beispiel hat funktioniert.
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
@project
Variable mit einer ID aus der Datenbanktabelle anstelle eines Titels gefüllt hatte , wurde dieser Code auf der Rückseite des form.select
Helfers angehängt : selected: @project
Danke @danengle
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?
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}
Alternativ können Sie das Attribut: project_id im Controller festlegen, da das erste Argument von f.select dieses bestimmte Attribut abruft.
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
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' %>
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
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] } %>