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?
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?
Jawaban:
Ini harus dilakukan:
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
options_for_select
itu cara yang lebih baik. Ini bagus untuk situasi apa pun, baik untuk edit formulir juga.
Gunakan atribut yang tepat dari instance saat ini (misalnya @work.project_id
):
<%= f.select :project_id, options_for_select(..., @work.project_id) %>
select_tag
juga. Terima kasih itu sangat membantu saya juga.
options_for_select(..., f.object.project_id )
Rails 3.0.9
select options_for_select([value1, value2, value3], default)
value3], default
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.field
Anda selalu gunakan f.object
kemudian tambahkan nama bidang Anda di akhir itu.
select2
plugin JS. Berfungsi sempurna jika Anda membuat atau mengedit catatan dengan bentuk yang sama dan menggunakan select2, terutama dengan teks placeholder.
Coba ini:
<%= f.select :project_id, @project_select, :selected => f.object.project_id %>
params[:pid]
itu tidak berhasil, tetapi contoh Anda berhasil.
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
@project
variabel saya dengan id dari tabel database, alih-alih judul, kode ini berfungsi ditambahkan ke bagian belakang form.select
helper: selected: @project
Terima kasih @danengle
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?
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}
Atau, Anda dapat mengatur atribut: project_id di controller, karena argumen pertama dari f.select menarik atribut tertentu.
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
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' %>
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
Ini seharusnya bekerja untuk Anda. Itu hanya diteruskan {:value => params[:pid] }
ke variabel html_options.
<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>