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?


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] %>

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) %>

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)

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.


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 %>

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


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?

7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>

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}

2
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>

0

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


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 

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' %>

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

-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] } %>

ale nie wybierze odpowiedniego elementu w zaznaczeniu: S
totocaster
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.