Raylar yardımcı seç - Varsayılan seçilen değer, nasıl?


182

İşte şimdi kullanıyorum kod parçası:

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

Varsayılan değer params[:pid], sayfa yüklendiğinde eşit olacak şekilde nasıl değiştirilir ?


Sayfa yüklendiğinde varsayılan bir proje seçilmesini isteyip istemediğinizden emin değilim: project_id ayarlanmamışsa veya params karma öğesindeki select değerini pid olarak döndürmek istiyorsanız emin değilim.
Tilendor

Yanıtlar:


223

Bunu yapmalı:

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

5
paramsuz, options_for_selectdaha iyi bir yoldur. Herhangi bir durum için iyidir, form düzenleme için de iyidir.
Adriano Resende

İşte KEY: LOOK işlevinizde (options_for_select () vs f.select. Bunların farklı işlevler olduğunu hatırlayın
FlyingV

126

Geçerli örneğin doğru niteliğini kullanın (örneğin @work.project_id):

<%= f.select :project_id, options_for_select(..., @work.project_id) %>

4
Bu en iyi cevaptır çünkü birlikte select_tagde çalışır . Teşekkürler gerçekten de bana yardımcı oldu.
stephenmurdoch

7
Ayrıca deneyebileceğinizoptions_for_select(..., f.object.project_id )
18augst

Çok teşekkürler! Kabul edilen diğer tüm cevaplar değişken üzerinden nasıl seçileceğini söylemez.
Mike Belanger

52

Raylar 3.0.9

select options_for_select([value1, value2, value3], default)

Varsayılan değerinizi ayıran virgül ÖNCE değerler dizisi etrafında kapanış parantez fark edene kadar bu çözümü anlayamadım ... Bu braketi burada kaçırdımvalue3], default
BigRon

33

Tüm bu yanıtların sorunu, kaydınızı düzenlemeye çalışsanız bile alanı varsayılan değere ayarlamalarıdır.

Varsayılanı mevcut değerinize ayarlamanız ve ardından yalnızca bir değeriniz yoksa gerçek varsayılana ayarlamanız gerekir. Şöyle ki:

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

Size aşina olmayan herkes için f.object.fieldher zaman şunu kullanın f.objectve alan adınızı bunun sonuna ekleyin.


3
Bu temiz bir çözümdür ve belirtildiği gibi varsayılan değeri yalnızca yeni, geçerli değeri ise düzenleme olarak ayarlamak istersiniz.
say0

1
Bu eski bir iş parçacığı olduğunu biliyorum ama rastlamak herkes için, bu cevap da select2JS eklentisi ile çalışır . Aynı formda kayıtlar oluşturuyor veya düzenliyorsanız ve özellikle yer tutucu metniyle select2 kullanıyorsanız mükemmel çalışır.
cdouble.bhuck

Sanırım bu cevap olarak kabul edilen kişi olmalı, @Mike Bethany, diğer tüm cevapların, sadece raylar yaklaşımı formu yeniden kullanmak olduğunda formun sadece yeni kayıtlar için oluşturulduğunu varsayar. Kudos Mike
Erick Castrillo

22

Bunu dene:

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

Rails 4'ü kullandığınızda params[:pid]işe yaramadı, ancak örneğiniz işe yaradı.
Eric Wanchic

Kısmi bir "f.fields_for" içinde kullandığım için bu benim için çalıştı Teşekkürler.
Hugo

11

params [: pid] bir dize ise, eğer bir formdan geliyorsa, muhtemelen

params[:pid].to_i  

seçim listesinde seçilecek doğru öğe için


Bu cevap sorunumu belirlememe yardımcı oldu. Seçim kutum dinamik ve veritabanından bir koleksiyon çekiyor. Öğenin kimliği değil, bir başlık ile varsayılan seçimi doldurmaya çalışıyordum. Bu yanıt bu sorunu görmeme yardımcı oldu ve bir kez @projectdeğişkenimi veritabanı tablosundan bir kimlikle doldurduktan sonra , bir başlık yerine, bu kod form.selectyardımcısının arkasına eklendi : selected: @projectTeşekkürler @danengle
Christopher Warrington

10

Çözüm buldum ve RoR'da oldukça tecrübesiz olduğumu fark ettim.

Yukarıda açıklanan görünümü yöneten denetleyicinin içine şunu ekleyin:

@work.project_id = params[:pid] unless params[:pid].nil?

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

3

İşe bu olsun ve ben doğru değil sadece "seçilmiş" html öznitelik eklemek için gerekli bulundu olamazdı <option>etiketi ama aynı zamanda hiç <select>etiketi. Seçim etiketinin seçilen özniteliğindeki MDN belgeleri şunları söylüyor:

seçilmiş - Boolean özniteliği, başlangıçta belirli bir seçeneğin seçilebileceğini gösterir.

Bu, kodun şöyle görünmesi gerektiği anlamına gelir:

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

Alternatif olarak, f.select öğesinin ilk bağımsız değişkeni belirli bir özniteliği çektiği için denetleyicide: project_id özniteliğini ayarlayabilirsiniz.


0

F nesnesini yazdırmaya çalışırsanız, seçilen öğeyi almak için problanabilecek f.object olduğunu göreceksiniz (tüm raylar sürümü> 2.3 için geçerlidir)

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

bu nedenle, uygun seçili seçeneği elde etmek için aşağıdaki komut dosyasını kullanın:

:selected => f.object.your_field 

0

Daha önce açıklanmış, bir örnek vermeye çalışacak

seçim listesinin olmasına izin ver

select_list = { eligible: 1, ineligible: 0 }

Yani aşağıdaki kod

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

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

Bu nedenle, varsayılan olarak seçilen bir seçeneği yapmak için seçilmiş: değeri kullanmamız gerekir .

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

eğer can_vote? seçilen set değerini true olarak döndürür : 1 sonra ilk değer ikinci olarak seçilecektir.

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

eğer seçim seçenekleri hast yerine sadece bir dizi listesiyse, seçilen sadece seçilecek değer olacaktır.

select_list = [ 'eligible', 'ineligible' ]

şimdi seçilen

<%= f.select :to_vote, select_list, selected: 'ineligible' %>

0

Mike Bethany'nin yukarıdaki yanıtı, yeni bir kayıt oluşturulurken varsayılan bir değer ayarlamak ve yine de düzenleme formunda kullanıcının seçtiği değeri göstermek için çalıştı. Ancak, bir model doğrulaması ekledim ve formu göndermeme izin vermedi. Alanda bir model doğrulaması yapmak ve varsayılan bir değer ile kullanıcının düzenleme modunda seçtiği değeri göstermek benim için işe yarayan şeydi.

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

Model geçerliliği

  validates :project_id, presence: true

-2

Bu senin için işe yaramalı. Sadece {:value => params[:pid] }html_options değişkenine geçer .

<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>

ancak
seçimde
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.