นี่คือส่วนหนึ่งของรหัสที่ฉันใช้ตอนนี้:
<%= f.select :project_id, @project_select %>
วิธีการแก้ไขเพื่อให้ค่าเริ่มต้นเท่ากับparams[:pid]
เมื่อหน้าโหลด?
นี่คือส่วนหนึ่งของรหัสที่ฉันใช้ตอนนี้:
<%= f.select :project_id, @project_select %>
วิธีการแก้ไขเพื่อให้ค่าเริ่มต้นเท่ากับparams[:pid]
เมื่อหน้าโหลด?
คำตอบ:
สิ่งนี้ควรทำ:
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
options_for_select
เป็นวิธีที่ดี มันดีสำหรับทุกสถานการณ์เหมาะสำหรับการแก้ไขแบบฟอร์มด้วย
ใช้คุณลักษณะที่ถูกต้องของอินสแตนซ์ปัจจุบัน (เช่น@work.project_id
):
<%= f.select :project_id, options_for_select(..., @work.project_id) %>
select_tag
เช่นกัน ขอบคุณมันช่วยฉันด้วย
options_for_select(..., f.object.project_id )
Rails 3.0.9
select options_for_select([value1, value2, value3], default)
value3], default
ปัญหาของคำตอบทั้งหมดนี้คือพวกเขาตั้งค่าฟิลด์เป็นค่าเริ่มต้นแม้ว่าคุณจะพยายามแก้ไขบันทึกของคุณ
คุณจำเป็นต้องตั้งค่าเริ่มต้นเป็นค่าที่มีอยู่ของคุณแล้วเพียงตั้งค่าให้เริ่มต้นที่เกิดขึ้นจริงถ้าคุณไม่ได้มีค่า ชอบมาก
f.select :field, options_for_select(value_array, f.object.field || default_value)
สำหรับทุกคนที่ไม่คุ้นเคยกับf.object.field
คุณให้ใช้ชื่อf.object
นั้นแล้วเพิ่มชื่อฟิลด์ของคุณลงในส่วนท้ายของ
select2
ปลั๊กอิน JS ด้วย ทำงานได้อย่างสมบูรณ์หากคุณกำลังสร้างหรือแก้ไขบันทึกด้วยแบบฟอร์มเดียวกันและใช้ select2 โดยเฉพาะกับข้อความตัวยึดตำแหน่ง
ลองสิ่งนี้:
<%= f.select :project_id, @project_select, :selected => f.object.project_id %>
params[:pid]
ไม่ได้ แต่ตัวอย่างของคุณทำได้
ถ้า params [: pid] เป็นสตริงซึ่งถ้ามาจากแบบฟอร์มคุณต้องใช้
params[:pid].to_i
เพื่อให้รายการที่ถูกต้องถูกเลือกในรายการที่เลือก
@project
ตัวแปรของฉันด้วยรหัสจากตารางฐานข้อมูลแทนชื่อรหัสนี้ทำงานผนวกกับด้านหลังของform.select
ผู้ช่วย: selected: @project
ขอบคุณ @danengle
ฉันพบวิธีแก้ปัญหาแล้วและพบว่าฉันไม่มีประสบการณ์ใน RoR
ภายในตัวควบคุมที่จัดการมุมมองที่อธิบายข้างต้นเพิ่มสิ่งนี้:
@work.project_id = params[:pid] unless params[:pid].nil?
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
ฉันไม่สามารถใช้งานได้และพบว่าฉันต้องเพิ่มแอตทริบิวต์ html ที่ "เลือก" ไม่เพียง<option>
แต่แท็กที่ถูกต้องแต่ยังรวมถึง<select>
แท็กด้วย เอกสารของ MDN เกี่ยวกับคุณสมบัติที่เลือกของแท็กที่เลือกจะกล่าวว่า:
ถูกเลือก - คุณลักษณะบูลีนบ่งชี้ว่าสามารถเลือกตัวเลือกเฉพาะได้ในตอนแรก
นั่นหมายความว่ารหัสควรมีลักษณะดังนี้:
f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>
อีกวิธีหนึ่งคุณสามารถตั้งค่า: project_id คุณลักษณะในตัวควบคุมเนื่องจากอาร์กิวเมนต์แรกของ f.select ดึงคุณลักษณะเฉพาะนั้น
หากลองพิมพ์วัตถุ f คุณจะเห็นว่ามี f.object ที่สามารถตรวจสอบเพื่อรับรายการที่เลือก (ใช้ได้กับทุกรุ่นราง> 2.3)
logger.warn("f #{f.object.inspect}")
ดังนั้นใช้สคริปต์ต่อไปนี้เพื่อรับตัวเลือกที่ถูกต้อง:
:selected => f.object.your_field
อธิบายแล้วมันจะพยายามยกตัวอย่าง
ให้รายการที่เลือกเป็น
select_list = { eligible: 1, ineligible: 0 }
ดังนั้นรหัสต่อไปนี้จึงได้ผล
<%= f.select :to_vote, select_list %>
<select name="to_vote" id="to_vote">
<option value="1">eligible</option>
<option value="0">ineligible</option>
</select>
ดังนั้นเพื่อให้ตัวเลือกที่เลือกโดยค่าเริ่มต้นเราต้องใช้เลือก: คุ้มค่า
<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>
ถ้าcan_vote ผลตอบแทนจริงมันชุดที่เลือก: 1แล้วค่าแรกจะถูกเลือกอื่นที่สอง
select name="driver[bca_aw_eligible]" id="driver_bca_aw_eligible">
<option value="1">eligible</option>
<option selected="selected" value="0">ineligible</option>
</select>
หากตัวเลือกการเลือกเป็นเพียงรายการอาร์เรย์แทนที่จะเป็นแบบเร่งด่วนตัวเลือกที่เลือกจะเป็นเพียงค่าที่จะถูกเลือกตัวอย่างเช่นถ้า
select_list = [ 'eligible', 'ineligible' ]
ตอนนี้สิ่งที่เลือกจะใช้เวลา
<%= f.select :to_vote, select_list, selected: 'ineligible' %>
คำตอบของ Mike Bethany ทำงานเพื่อกำหนดค่าเริ่มต้นเมื่อมีการสร้างระเบียนใหม่และยังคงมีค่าที่ผู้ใช้เลือกแสดงในแบบฟอร์มแก้ไข อย่างไรก็ตามฉันได้เพิ่มการตรวจสอบความถูกต้องของแบบจำลองและจะไม่ให้ฉันส่งแบบฟอร์ม นี่คือสิ่งที่ทำงานสำหรับฉันที่จะมีการตรวจสอบรูปแบบในสนามและเพื่อแสดงค่าเริ่มต้นเช่นเดียวกับค่าที่ผู้ใช้เลือกเมื่ออยู่ในโหมดแก้ไข
<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>
การตรวจสอบรูปแบบ
validates :project_id, presence: true
สิ่งนี้น่าจะเหมาะกับคุณ มันเพิ่งผ่าน{:value => params[:pid] }
ไปยังตัวแปร html_options
<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>