Oto fragment kodu, którego teraz używam:
<%= f.select :project_id, @project_select %>
Jak go zmodyfikować, aby jego wartość domyślna była równa params[:pid]
po załadowaniu strony?
Oto fragment kodu, którego teraz używam:
<%= f.select :project_id, @project_select %>
Jak go zmodyfikować, aby jego wartość domyślna była równa params[:pid]
po załadowaniu strony?
Odpowiedzi:
To powinno to zrobić:
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
options_for_select
jest lepszy sposób. Nadaje się do każdej sytuacji, a także do edycji formularza.
Użyj właściwego atrybutu bieżącej instancji (np. @work.project_id
):
<%= f.select :project_id, options_for_select(..., @work.project_id) %>
select_tag
. Dzięki, naprawdę mi też pomogło.
options_for_select(..., f.object.project_id )
Szyny 3.0.9
select options_for_select([value1, value2, value3], default)
value3], default
Problem z tymi wszystkimi odpowiedziami polega na tym, że ustawiają one pole na wartość domyślną, nawet jeśli próbujesz edytować swój rekord.
Trzeba ustawić domyślną do istniejącej wartości, a następnie tylko ustawić go do rzeczywistej domyślnie jeśli nie mają wartości. Tak jak:
f.select :field, options_for_select(value_array, f.object.field || default_value)
Dla każdego, kto f.object.field
cię nie zna , zawsze używaj, f.object
a następnie dodaj nazwę pola na końcu.
select2
wtyczką JS. Działa idealnie, jeśli tworzysz lub edytujesz rekordy w tym samym formularzu i używasz select2, zwłaszcza z tekstem zastępczym.
Spróbuj tego:
<%= f.select :project_id, @project_select, :selected => f.object.project_id %>
params[:pid]
nie działało, ale twój przykład działał.
jeśli params [: pid] jest ciągiem, który jeśli pochodzi z formularza, to prawdopodobnie będziesz musiał go użyć
params[:pid].to_i
aby wybrać właściwy element z listy wyboru
@project
zmienną identyfikatorem z tabeli bazy danych, zamiast tytułu, ten kod działał dołączony na odwrocie form.select
pomocnika: selected: @project
Dziękuję @danengle
Znalazłem rozwiązanie i stwierdziłem, że jestem dość niedoświadczony w RoR.
Wewnątrz kontrolera zarządzającego widokiem opisanym powyżej dodaj:
@work.project_id = params[:pid] unless params[:pid].nil?
Nie mogłem tego uruchomić i stwierdziłem, że muszę dodać atrybut „zaznaczony” HTML nie tylko do poprawnego <option>
tagu, ale także do <select>
tagu. Dokumenty MDN dotyczące wybranego atrybutu tagu select mówią:
selected - atrybut boolowski wskazuje, że można początkowo wybrać określoną opcję.
Oznacza to, że kod powinien wyglądać następująco:
f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}
Alternatywnie możesz ustawić atrybut: project_id w kontrolerze, ponieważ pierwszy argument f.select ściąga ten konkretny atrybut.
Jeśli spróbujesz wydrukować obiekt f, zobaczysz, że istnieje obiekt f., Który można sondować w celu uzyskania wybranego elementu (dotyczy wszystkich wersji szyn> 2.3)
logger.warn("f #{f.object.inspect}")
więc użyj następującego skryptu, aby uzyskać odpowiednią wybraną opcję:
:selected => f.object.your_field
Wyjaśniono już, Spróbuję podać przykład
niech wybrana lista będzie
select_list = { eligible: 1, ineligible: 0 }
Tak więc następujący kod powoduje
<%= f.select :to_vote, select_list %>
<select name="to_vote" id="to_vote">
<option value="1">eligible</option>
<option value="0">ineligible</option>
</select>
Aby więc domyślnie wybrać opcję, musimy użyć opcji select: wartość .
<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>
jeśli możesz głosować? zwraca true, ustawia wybrane: 1, a następnie pierwsza wartość zostanie wybrana w innym przypadku.
select name="driver[bca_aw_eligible]" id="driver_bca_aw_eligible">
<option value="1">eligible</option>
<option selected="selected" value="0">ineligible</option>
</select>
jeśli opcje select są tylko listą tablic zamiast hast, wówczas wybrana będzie tylko wartość do wyboru, na przykład if
select_list = [ 'eligible', 'ineligible' ]
teraz wybrane po prostu zajmie
<%= f.select :to_vote, select_list, selected: 'ineligible' %>
Powyższa odpowiedź Mike'a Bethany'ego działała, aby ustawić domyślną wartość podczas tworzenia nowego rekordu i nadal mieć wartość, którą wybrał użytkownik w formularzu edycji. Dodałem jednak weryfikację modelu i nie pozwoli mi to przesłać formularza. Oto, co działało dla mnie, aby przeprowadzić walidację modelu w polu i pokazać wartość domyślną, a także wartość wybraną przez użytkownika w trybie edycji.
<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>
walidacja modelu
validates :project_id, presence: true
To powinno ci pomóc. Po prostu przechodzi {:value => params[:pid] }
do zmiennej html_options.
<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>