Pomocnik wyboru szyn - domyślnie wybrana wartość, jak?

182

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?

totocaster
źródło
Nie jestem pewien, czy chcesz, aby domyślny projekt był wybierany podczas ładowania strony, czy: id_projektu nie jest ustawiony, czy też chcesz zwrócić wartość zaznaczenia w skrócie params jako: pid.
Tilendor

Odpowiedzi:

223

To powinno to zrobić:

<%= f.select :project_id, @project_select, :selected => params[:pid] %>
htanata
źródło
5
bez parametrów, options_for_selectjest lepszy sposób. Nadaje się do każdej sytuacji, a także do edycji formularza.
Adriano Resende,
Oto KLUCZ: WYGLĄD na swoją funkcję (options_for_select () vs f.select. Pamiętaj, że są to różne funkcje.
FlyingV
126

Użyj właściwego atrybutu bieżącej instancji (np. @work.project_id):

<%= f.select :project_id, options_for_select(..., @work.project_id) %>
ryś
źródło
4
To najlepsza odpowiedź, ponieważ również działa select_tag. Dzięki, naprawdę mi też pomogło.
stephenmurdoch
7
Możesz także spróbowaćoptions_for_select(..., f.object.project_id )
sierpnia
Dzięki wielkie! Wszystkie pozostałe akceptowane odpowiedzi nie mówią, jak dokonać wyboru przez zmienną.
Mike Belanger,
52

Szyny 3.0.9

select options_for_select([value1, value2, value3], default)
Cheng
źródło
Nie mogłem znaleźć tego rozwiązania, dopóki nie zauważyłem twojego nawiasu zamykającego wokół tablicy wartości PRZED przecinkiem, który oddziela twoją wartość domyślną ... Przegapiłem ten nawias tutajvalue3], default
BigRon
33

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.fieldcię nie zna , zawsze używaj, f.objecta następnie dodaj nazwę pola na końcu.

Mike Bethany
źródło
3
To czyste rozwiązanie i jak wspomniano, chcesz ustawić wartość domyślną tylko na nową, a bieżącą wartość na edycji.
policz 0
1
Wiem, że to stary wątek, ale dla każdego, kto może go spotkać, ta odpowiedź działa również z select2wtyczką JS. Działa idealnie, jeśli tworzysz lub edytujesz rekordy w tym samym formularzu i używasz select2, zwłaszcza z tekstem zastępczym.
cdouble.bhuck
Myślę, że powinna to być odpowiedź zaakceptowana, tak jak @Mike Bethany powiedział, że wszystkie inne odpowiedzi twierdzą, że formularz jest renderowany tylko dla nowych rekordów, gdy podejście szyn ma ponownie użyć formularza. Kudos Mike
Erick Castrillo
22

Spróbuj tego:

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>
gavit
źródło
Korzystanie z Rails 4 params[:pid]nie działało, ale twój przykład działał.
Eric Wanchic,
To zadziałało dla mnie, ponieważ używam częściowego fragmentu „f.fields_for” Thanks.
Hugo,
11

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

Danengle
źródło
Ta odpowiedź pomogła mi wskazać mój problem. Moje pole wyboru jest dynamiczne i pobiera kolekcję z bazy danych. Próbowałem wypełnić domyślną selekcję tytułem, a nie identyfikatorem elementu. Ta odpowiedź pomogła mi dostrzec ten problem i kiedy zapełniłem moją @projectzmienną identyfikatorem z tabeli bazy danych, zamiast tytułu, ten kod działał dołączony na odwrocie form.selectpomocnika: selected: @projectDziękuję @danengle
Christopher Warrington
10

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?
totocaster
źródło
7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
jschorr
źródło
3

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}
Shelvacu
źródło
2
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>
swapnilp
źródło
0

Alternatywnie możesz ustawić atrybut: project_id w kontrolerze, ponieważ pierwszy argument f.select ściąga ten konkretny atrybut.

promacuser
źródło
0

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 
użytkownik2480972
źródło
0

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' %>
Shiva Kumar
źródło
0

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
random_user_0891
źródło
-2

To powinno ci pomóc. Po prostu przechodzi {:value => params[:pid] }do zmiennej html_options.

<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>
epocholf
źródło
ale nie wybierze odpowiedniego elementu w zaznaczeniu: S
totocaster