Pilih bantu hels - Nilai yang dipilih default, bagaimana?

182

Ini adalah sepotong kode yang saya gunakan sekarang:

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

Bagaimana memodifikasinya untuk membuat nilai standarnya sama dengan params[:pid]ketika halaman dimuat?

totocaster
sumber
Saya tidak yakin apakah Anda ingin proyek default dipilih ketika halaman dimuat, jika: project_id tidak disetel, atau jika Anda ingin mengembalikan nilai pilih dalam hash params sebagai: pid.
Tilendor

Jawaban:

223

Ini harus dilakukan:

<%= f.select :project_id, @project_select, :selected => params[:pid] %>
htanata
sumber
5
tanpa params, options_for_selectitu cara yang lebih baik. Ini bagus untuk situasi apa pun, baik untuk edit formulir juga.
Adriano Resende
Inilah KUNCInya: LIHAT fungsi Anda (options_for_select () vs f.select. Ingat ini adalah fungsi yang berbeda.
FlyingV
126

Gunakan atribut yang tepat dari instance saat ini (misalnya @work.project_id):

<%= f.select :project_id, options_for_select(..., @work.project_id) %>
lynx
sumber
4
Ini adalah jawaban terbaik karena bisa digunakan select_tagjuga. Terima kasih itu sangat membantu saya juga.
stephenmurdoch
7
Anda juga dapat mencobaoptions_for_select(..., f.object.project_id )
18augst
Terima kasih banyak! Semua jawaban lain yang diterima tidak mengatakan bagaimana memilih melalui variabel.
Mike Belanger
52

Rails 3.0.9

select options_for_select([value1, value2, value3], default)
Cheng
sumber
Saya tidak dapat menemukan solusi ini sampai saya melihat braket penutupan Anda di sekitar array nilai SEBELUM koma yang memisahkan nilai default Anda ... Saya melewatkan braket ini di sinivalue3], default
BigRon
33

Masalah dengan semua jawaban ini adalah mereka menetapkan bidang ke nilai default bahkan jika Anda mencoba mengedit catatan Anda.

Anda perlu mengatur default ke nilai yang ada dan kemudian hanya mengaturnya ke default aktual jika Anda tidak memiliki nilai. Seperti itu:

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

Bagi siapa pun yang tidak terbiasa dengan f.object.fieldAnda selalu gunakan f.objectkemudian tambahkan nama bidang Anda di akhir itu.

Mike Bethany
sumber
3
Itu solusi bersih, dan seperti yang disebutkan Anda ingin menetapkan nilai default hanya pada yang baru dan nilai saat ini pada edit.
Hitung0
1
Saya tahu ini adalah utas lama tetapi bagi siapa saja yang mungkin menemukannya, jawaban ini juga berfungsi dengan select2plugin JS. Berfungsi sempurna jika Anda membuat atau mengedit catatan dengan bentuk yang sama dan menggunakan select2, terutama dengan teks placeholder.
cdouble.bhuck
Saya pikir ini yang harus diterima sebagai Jawaban, seperti @Mike Bethany mengatakan semua jawaban lain asumme formulir diberikan hanya untuk catatan baru ketika pendekatan rel adalah untuk menggunakan kembali formulir. Kudos Mike
Erick Castrillo
22

Coba ini:

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>
gavit
sumber
Menggunakan Rails 4, params[:pid]itu tidak berhasil, tetapi contoh Anda berhasil.
Eric Wanchic
Ini bekerja untuk saya karena saya menggunakan sebagian di dalam "f.fields_for" Terima kasih.
Hugo
11

jika params [: pid] adalah string, yang jika berasal dari formulir, itu adalah, Anda mungkin perlu menggunakannya

params[:pid].to_i  

untuk item yang benar untuk dipilih dalam daftar pilih

danengle
sumber
Jawaban ini membantu saya menunjukkan masalah saya. Kotak pilih saya dinamis dan menarik koleksi dari database. Saya mencoba mengisi seleksi default dengan judul, bukan id item. Jawaban ini membantu saya melihat masalah itu, dan begitu saya mengisi @projectvariabel saya dengan id dari tabel database, alih-alih judul, kode ini berfungsi ditambahkan ke bagian belakang form.selecthelper: selected: @projectTerima kasih @danengle
Christopher Warrington
10

Saya telah menemukan solusi dan saya menemukan bahwa saya tidak berpengalaman dalam RoR.

Di dalam controller yang mengelola tampilan yang dijelaskan di atas, tambahkan ini:

@work.project_id = params[:pid] unless params[:pid].nil?
totocaster
sumber
7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
Jschorr
sumber
3

Saya tidak dapat mengaktifkannya dan menemukan bahwa saya perlu menambahkan atribut html "terpilih" tidak hanya ke <option>tag yang benar tetapi juga ke <select>tag. Dokumen MDN tentang atribut yang dipilih dari tag pilih mengatakan:

dipilih - Atribut Boolean menunjukkan bahwa opsi tertentu dapat dipilih pada awalnya.

Itu berarti kode tersebut akan terlihat seperti:

f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}
Shelvacu
sumber
2
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>
swapnilp
sumber
0

Atau, Anda dapat mengatur atribut: project_id di controller, karena argumen pertama dari f.select menarik atribut tertentu.

promacuser
sumber
0

Jika mencoba mencetak objek f, maka Anda akan melihat bahwa ada objek f. Yang dapat diselidiki untuk mendapatkan item yang dipilih (berlaku untuk semua versi rel> 2.3)

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

jadi, gunakan skrip berikut untuk mendapatkan opsi yang dipilih dengan benar:

:selected => f.object.your_field 
pengguna2480972
sumber
0

Sudah dijelaskan, Akan mencoba memberi contoh

biarkan daftar pilih

select_list = { eligible: 1, ineligible: 0 }

Jadi kode berikut menghasilkan

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

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

Jadi untuk membuat opsi yang dipilih secara default, kita harus menggunakan nilai: terpilih .

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

jika can_vote? mengembalikan true set yang dipilih: 1 maka nilai pertama akan dipilih yang lain kedua.

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

jika opsi yang dipilih hanya daftar array bukan terburu-buru maka yang dipilih akan menjadi nilai yang akan dipilih misalnya jika

select_list = [ 'eligible', 'ineligible' ]

sekarang yang dipilih hanya akan mengambil

<%= f.select :to_vote, select_list, selected: 'ineligible' %>
shiva kumar
sumber
0

Jawaban Mike Bethany di atas berfungsi untuk menetapkan nilai default ketika catatan baru sedang dibuat dan masih memiliki nilai yang dipilih pengguna dalam formulir edit. Namun, saya menambahkan validasi model dan itu tidak akan membiarkan saya mengirimkan formulir. Inilah yang berhasil bagi saya untuk memiliki validasi model di lapangan dan untuk menunjukkan nilai default serta nilai yang dipilih pengguna saat dalam mode edit.

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

validasi model

  validates :project_id, presence: true
random_user_0891
sumber
-2

Ini seharusnya bekerja untuk Anda. Itu hanya diteruskan {:value => params[:pid] }ke variabel html_options.

<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>
epochwolf
sumber
tetapi itu tidak akan memilih item yang sesuai di pilih: S
totocaster