ใครสามารถอธิบาย collection_select ให้ฉันอย่างชัดเจนและเรียบง่ายได้ไหม?


146

ฉันกำลังอ่านเอกสาร API ของ Rails collection_selectและพวกเขาก็น่ากลัวมาก

หัวข้อคือ:

collection_select(object, method, collection, value_method, text_method, options = {}, html_options = {})

และนี่คือตัวอย่างโค้ดเดียวที่ให้:

collection_select(:post, :author_id, Author.all, :id, :name_with_initial, :prompt => true)

ใครสามารถอธิบายโดยใช้การเชื่อมโยงแบบง่าย (พูดUserhas_many Plansและเป็นPlanของ a User) สิ่งที่ฉันต้องการใช้ในไวยากรณ์และทำไม

แก้ไข 1:มันจะยอดเยี่ยมถ้าคุณอธิบายว่ามันทำงานอย่างไรภายในform_helperหรือรูปแบบปกติ ลองนึกภาพคุณกำลังอธิบายสิ่งนี้กับผู้พัฒนาเว็บที่เข้าใจการพัฒนาเว็บ แต่เป็น 'ค่อนข้างใหม่' สำหรับ Rails คุณจะอธิบายได้อย่างไร


50
ใช่. นั่นเป็นเอกสารที่แย่ที่สุดที่ฉันเคยเห็น
Jaseem

1
เอกสารมีความเป็นธรรมไม่เพียงFormBuilderแต่ในFormOptionsHelper: api.rubyonrails.org/classes/ActionView/Helpers/ …
amiuhle

1
ส่วนที่ฉันชอบคือเมื่อคุณใช้ collection_select ในรูปแบบและเปลี่ยนลายเซ็นทั้งหมดเพื่อให้วัตถุไม่ได้เป็นส่วนหนึ่งของรายการพารามิเตอร์ แต่แทนที่จะเรียกว่า collection_select เป็นวิธีการบนวัตถุ อย่าคิดว่าพวกเขาพูดถึงเรื่องนี้ในเอกสาร ...
user3670743

1
นี่เป็นโครงการโอเพนซอร์ซ: หากเอกสารไม่ดีเรามีเพียงเราเองที่จะตำหนิ มันอาจจะน่าอัศจรรย์ถ้าเพียง แต่เราจะทำบิตของเราเพื่อทำให้ดีขึ้น PR ขนาดเล็ก / ง่ายไปไกล
BKSpurgeon

คำตอบ:


305
collection_select(
    :post, # field namespace 
    :author_id, # field name
    # result of these two params will be: <select name="post[author_id]">...

    # then you should specify some collection or array of rows.
    # It can be Author.where(..).order(..) or something like that. 
    # In your example it is:
    Author.all, 

    # then you should specify methods for generating options
    :id, # this is name of method that will be called for every row, result will be set as key
    :name_with_initial, # this is name of method that will be called for every row, result will be set as value

    # as a result, every option will be generated by the following rule: 
    # <option value=#{author.id}>#{author.name_with_initial}</option>
    # 'author' is an element in the collection or array

    :prompt => true # then you can specify some params. You can find them in the docs.
)

หรือตัวอย่างของคุณสามารถแสดงเป็นรหัสต่อไปนี้:

<select name="post[author_id]">
    <% Author.all.each do |author| %>
        <option value="<%= author.id %>"><%= author.name_with_initial %></option>
    <% end %>
</select>

นี่ไม่ใช่เอกสารในFormBuilderแต่ในFormOptionsHelper


32
นี่เป็นคำอธิบายที่ดีที่สุดของโครงสร้าง Rails ที่ฉันเห็น คุณใช้ภาษาที่ชัดเจนพร้อมกับโครงสร้างพื้นฐานของ Rails เพื่อสร้างความแข็งแกร่ง ขอบคุณมาก!!
marcamillion

2
ทำไมคุณถึงตั้งชื่อมันว่า "post [author_id]"
Jaseem

@alexkv ขอบคุณ - คุณจะสามารถอธิบายความสำคัญของ: post, # field namespace และ: author_id, # พารามิเตอร์ชื่อฟิลด์ (สองคนแรก) - ฉันไม่เข้าใจวัตถุประสงค์ของพวกเขาในรูปแบบของสิ่งต่าง ๆ - สามารถ ' พวกเขาจะถูกละเว้น?
BKSpurgeon

1
พารามิเตอร์แรกสามารถเป็นศูนย์ได้ ถ้าคุณกำลังสร้างฟอร์มวัตถุมันจะเป็นวัตถุนั้นเพื่อให้การเลือกนั้นมีเนมสเปซเดียวกันกับส่วนที่เหลือของฟอร์ม หากไม่ต้องการให้เว้นที่ 1 เป็นศูนย์ ที่สองคือชื่อของตัวควบคุมดังนั้นถ้ามันจะปรับปรุงเขตข้อมูลบนวัตถุ (พารามิเตอร์ที่ 1) แล้วชื่อเขตข้อมูลเป็นพารามิเตอร์ที่สอง หากคุณกำลังสร้างรูปแบบบางอย่างสำหรับการใช้งานอื่น ๆ พารามิเตอร์ที่ 2 คือสิ่งที่คุณต้องการให้การควบคุมรูปแบบชื่อและ id เหตุใดจึงใช้สิ่งนี้กับไม่มีที่ 1? อาจเป็นเพราะคุณต้องการ collection_select สำหรับตัวเลือกพรอมต์:
elc

1
ฉันควรทราบด้วยว่าคุณสามารถรับเอฟเฟกต์เดียวกันกับการตรึงพารามิเตอร์พรอมต์ลงบน select_tag ที่ใช้ options_for_select ซึ่งน่าจะตอบได้เหมือนกับ collection_select ด้วยออบเจ็กต์ nil
elc

21

ฉันใช้เวลาพอสมควรกับการเปลี่ยนลำดับของแท็กที่เลือก

collection_selectสร้างแท็กเลือกจากชุดของวัตถุ เก็บไว้ในใจ

object: ชื่อของวัตถุ ใช้เพื่อสร้างชื่อของแท็กและใช้เพื่อสร้างค่าที่เลือก นี่อาจเป็นวัตถุจริงหรือสัญลักษณ์ - ในกรณีหลังตัวแปรอินสแตนซ์ของชื่อนั้นจะถูกค้นหาในการเชื่อมโยงของActionController (นั่นคือจะ:postมองหา var อินสแตนซ์ที่เรียกว่า@postในคอนโทรลเลอร์ของคุณ)

method: ชื่อของวิธีการ สิ่งนี้ใช้เพื่อสร้างชื่อของแท็ก .. ในคำอื่น ๆ คุณลักษณะของวัตถุที่คุณพยายามรับจากการเลือก

collection : ชุดของวัตถุ

value_method : สำหรับแต่ละวัตถุในคอลเลกชันวิธีนี้ใช้เป็นค่า

text_method : สำหรับแต่ละวัตถุในคอลเลกชันวิธีนี้ใช้สำหรับข้อความที่แสดง

พารามิเตอร์ตัวเลือก:

options: ตัวเลือกที่คุณสามารถผ่าน เอกสารเหล่านี้มีไว้ที่นี่ภายใต้หัวข้อตัวเลือก

html_options: อะไรก็ตามที่ถูกส่งผ่านที่นี่จะถูกเพิ่มลงในแท็ก html ที่สร้างขึ้น ถ้าคุณต้องการระบุ class, id, หรือ attribute อื่น ๆ มันจะไปที่นี่

สมาคมของคุณสามารถเขียนเป็น:

collection_select(:user, :plan_ids, Plan.all, :id, :name, {:prompt => true, :multiple=>true })

สำหรับการใช้form_forงานนั้นมีเงื่อนไขง่าย ๆ สำหรับแท็กทั้งหมดที่อยู่ภายในform_forเช่น f.text_fieldคุณไม่จำเป็นต้องระบุobjectพารามิเตอร์แรก ( ) สิ่งนี้นำมาจากform_forไวยากรณ์


2
ขอขอบคุณที่สละเวลา ... ปัญหาเดียวคือในความซื่อสัตย์ทั้งหมดคำอธิบายของคุณไม่ได้ช่วยอธิบายสิ่งต่าง ๆ ในหัวของฉัน คุณใช้คำศัพท์จำนวนมากในคำจำกัดความที่แท้จริง ฉันซาบซึ้งที่คุณสละเวลา - ดังนั้นฉันจึงโหวตให้
marcamillion

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