Rails select helper - ค่าที่เลือกไว้เป็นค่าเริ่มต้นอย่างไร


182

นี่คือส่วนหนึ่งของรหัสที่ฉันใช้ตอนนี้:

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

วิธีการแก้ไขเพื่อให้ค่าเริ่มต้นเท่ากับparams[:pid]เมื่อหน้าโหลด?


ฉันไม่แน่ใจว่าคุณต้องการให้โครงการเริ่มต้นถูกเลือกเมื่อโหลดหน้าเว็บหรือไม่หากไม่ได้ตั้งค่า project_id หรือหากคุณต้องการส่งคืนค่าของตัวเลือกใน params hash เป็น: pid
Tilendor

คำตอบ:


223

สิ่งนี้ควรทำ:

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

5
โดยไม่ต้อง params, options_for_selectเป็นวิธีที่ดี มันดีสำหรับทุกสถานการณ์เหมาะสำหรับการแก้ไขแบบฟอร์มด้วย
Adriano Resende

นี่คือคีย์: ดูที่ฟังก์ชั่นของคุณ (options_for_select () vs f.select โปรดจำไว้ว่านี่คือฟังก์ชั่นที่แตกต่างกัน
FlyingV

126

ใช้คุณลักษณะที่ถูกต้องของอินสแตนซ์ปัจจุบัน (เช่น@work.project_id):

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

4
นี่เป็นคำตอบที่ดีที่สุดเพราะใช้ได้select_tagเช่นกัน ขอบคุณมันช่วยฉันด้วย
stephenmurdoch

7
นอกจากนี้คุณสามารถลองoptions_for_select(..., f.object.project_id )
18augst

ขอบคุณมาก! คำตอบที่ยอมรับอื่น ๆ ทั้งหมดไม่ได้บอกวิธีเลือกผ่านตัวแปร
Mike Belanger

52

Rails 3.0.9

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

ฉันไม่สามารถหาวิธีแก้ปัญหานี้ได้จนกว่าฉันจะสังเกตเห็นวงเล็บเหลี่ยมปิดของคุณรอบแถวค่าก่อนที่จะใช้เครื่องหมายจุลภาคคั่นค่าเริ่มต้นของคุณ ... ฉันพลาดวงเล็บนี้ที่นี่value3], default
BigRon

33

ปัญหาของคำตอบทั้งหมดนี้คือพวกเขาตั้งค่าฟิลด์เป็นค่าเริ่มต้นแม้ว่าคุณจะพยายามแก้ไขบันทึกของคุณ

คุณจำเป็นต้องตั้งค่าเริ่มต้นเป็นค่าที่มีอยู่ของคุณแล้วเพียงตั้งค่าให้เริ่มต้นที่เกิดขึ้นจริงถ้าคุณไม่ได้มีค่า ชอบมาก

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

สำหรับทุกคนที่ไม่คุ้นเคยกับf.object.fieldคุณให้ใช้ชื่อf.objectนั้นแล้วเพิ่มชื่อฟิลด์ของคุณลงในส่วนท้ายของ


3
นั่นเป็นคำตอบที่สะอาดและตามที่คุณต้องการตั้งค่าเริ่มต้นเฉพาะกับใหม่และค่าปัจจุบันในการแก้ไข
นับ 0

1
ฉันรู้ว่านี่เป็นเธรดเก่า แต่สำหรับใครก็ตามที่อาจเจอคำตอบนี้ใช้ได้กับselect2ปลั๊กอิน JS ด้วย ทำงานได้อย่างสมบูรณ์หากคุณกำลังสร้างหรือแก้ไขบันทึกด้วยแบบฟอร์มเดียวกันและใช้ select2 โดยเฉพาะกับข้อความตัวยึดตำแหน่ง
cdouble.bhuck

ฉันคิดว่านี่ควรเป็นคำตอบที่ได้รับการยอมรับเช่นเดียวกับ @Mike Bethany กล่าวว่าคำตอบอื่น ๆ ทั้งหมดเช่นเดียวกับแบบฟอร์มที่มีการแสดงสำหรับบันทึกใหม่เท่านั้นเมื่อแนวทางของทางรถไฟคือการนำแบบฟอร์มนั้นกลับมาใช้ใหม่ Kudos Mike
Erick Castrillo

22

ลองสิ่งนี้:

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

การใช้ Rails 4 นั้นใช้งานparams[:pid]ไม่ได้ แต่ตัวอย่างของคุณทำได้
Eric Wanchic

สิ่งนี้ใช้ได้กับฉันในขณะที่ฉันใช้บางส่วนใน "f.fields_for" ขอบคุณ
Hugo

11

ถ้า params [: pid] เป็นสตริงซึ่งถ้ามาจากแบบฟอร์มคุณต้องใช้

params[:pid].to_i  

เพื่อให้รายการที่ถูกต้องถูกเลือกในรายการที่เลือก


คำตอบนี้ช่วยฉันระบุปัญหาของฉัน กล่องที่เลือกของฉันเป็นแบบไดนามิกและดึงคอลเลกชันจากฐานข้อมูล ฉันพยายามเติมการเลือกเริ่มต้นด้วยชื่อไม่ใช่รหัสของรายการ คำตอบนี้ช่วยให้ฉันเห็นปัญหานั้นและเมื่อฉันเติม@projectตัวแปรของฉันด้วยรหัสจากตารางฐานข้อมูลแทนชื่อรหัสนี้ทำงานผนวกกับด้านหลังของform.selectผู้ช่วย: selected: @projectขอบคุณ @danengle
Christopher Warrington

10

ฉันพบวิธีแก้ปัญหาแล้วและพบว่าฉันไม่มีประสบการณ์ใน RoR

ภายในตัวควบคุมที่จัดการมุมมองที่อธิบายข้างต้นเพิ่มสิ่งนี้:

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


3

ฉันไม่สามารถใช้งานได้และพบว่าฉันต้องเพิ่มแอตทริบิวต์ html ที่ "เลือก" ไม่เพียง<option>แต่แท็กที่ถูกต้องแต่ยังรวมถึง<select>แท็กด้วย เอกสารของ MDN เกี่ยวกับคุณสมบัติที่เลือกของแท็กที่เลือกจะกล่าวว่า:

ถูกเลือก - คุณลักษณะบูลีนบ่งชี้ว่าสามารถเลือกตัวเลือกเฉพาะได้ในตอนแรก

นั่นหมายความว่ารหัสควรมีลักษณะดังนี้:

f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}


0

อีกวิธีหนึ่งคุณสามารถตั้งค่า: project_id คุณลักษณะในตัวควบคุมเนื่องจากอาร์กิวเมนต์แรกของ f.select ดึงคุณลักษณะเฉพาะนั้น


0

หากลองพิมพ์วัตถุ f คุณจะเห็นว่ามี f.object ที่สามารถตรวจสอบเพื่อรับรายการที่เลือก (ใช้ได้กับทุกรุ่นราง> 2.3)

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

ดังนั้นใช้สคริปต์ต่อไปนี้เพื่อรับตัวเลือกที่ถูกต้อง:

:selected => f.object.your_field 

0

อธิบายแล้วมันจะพยายามยกตัวอย่าง

ให้รายการที่เลือกเป็น

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

0

คำตอบของ 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

-2

สิ่งนี้น่าจะเหมาะกับคุณ มันเพิ่งผ่าน{:value => params[:pid] }ไปยังตัวแปร html_options

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

แต่จะไม่เลือกรายการที่เหมาะสมในการเลือก: S
totocaster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.