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?


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

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

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)

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.


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

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


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?

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

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}

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

0

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


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 

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

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

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

tetapi itu tidak akan memilih item yang sesuai di pilih: S
totocaster
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.