Birisi collection_select'i bana net ve basit terimlerle açıklayabilir mi?


149

Rails API belgelerine bakıyorum collection_selectve bunlar korkunç.

Başlık şudur:

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

Ve verdikleri tek örnek kod şudur:

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

Birisi basit bir ilişkilendirme kullanarak (bir Userhas_many Plansve a a'ya Planaittir diyelim User) söz diziminde neyi kullanmak istediğimi ve neden açıklayabilir mi?

Düzenleme 1: Ayrıca, form_helperbir formda veya normal bir formda nasıl çalıştığını açıklarsanız harika olur . Bunu web geliştirmeyi anlayan ancak Rails için 'nispeten yeni' olan bir web geliştiricisine açıkladığınızı hayal edin. Bunu nasıl açıklarsın?


50
Evet. Bu şimdiye kadar gördüğüm en berbat belge
Jaseem

1
Adil olmak gerekirse, dokümantasyon değil sadece içinde, oldukça Tamam FormBuilderama FormOptionsHelper: api.rubyonrails.org/classes/ActionView/Helpers/...
amiuhle

1
En sevdiğim kısım, collection_select'i bir formda kullandığınızda ve bu tüm imzayı değiştirdiğinde, nesnenin parametre listesinin bir parçası olmaması, bunun yerine collection_select'in nesne üzerinde bir yöntem olarak çağrılmasıdır. Dokümanlarda bundan bahsettiklerini
sanmayın

1
Bu açık kaynaklı bir projedir: Eğer dokümantasyon yetersizse, suçlayacak sadece kendimiz var; daha iyi hale getirmek için kendi payımıza düşeni yaparsak harika olabilirdi. Küçük / basit halkla ilişkiler uzun bir yol kat eder.
BKSpurgeon

Yanıtlar:


306
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.
)

Veya örneğiniz aşağıdaki kodla temsil edilebilir:

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

Bu belgede belgelenmez FormBuilder, ancakFormOptionsHelper


33
Bu kolayca, gördüğüm karmaşık bir Rails yapısının en iyi açıklamalarından biri. Onu sağlamlaştırmak için temel Rails yapılarıyla birlikte açık bir dil kullandınız. Çok teşekkürler!!
marcamillion

2
Neden ona "gönderi [yazar_kimliği]" adını verdiniz?
Jaseem

@alexkv teşekkür ederim - post, # alan ad alanı ve: author_id, # alan adı parametrelerinin (ilk ikisi) önemini açıklayabilir misiniz? ihmal edilmeyecekler mi?
BKSpurgeon

1
İlk parametre gerçekten de sıfır olabilir. Bir nesne formu oluşturuyorsanız, select formun geri kalanıyla aynı ad aralığına sahip olacak şekilde o nesne olacaktır. Buna gerek yoksa, 1'i sıfır olarak bırakın. İkincisi, denetimin adıdır, bu nedenle, bir nesnedeki bir alanı (1. parametre) güncelleyecekse, alan adı ikinci parametredir. Diğer kullanımlar için bir form oluşturuyorsanız, 2. parametre, form denetiminin adlandırılmasını ve kimliklendirilmesini istediğiniz şeydir. Bunu neden 1 nil ile kullanıyorsunuz? Muhtemelen: bilgi istemi seçenekleri için collection_select istediğiniz için.
elc

1
Ayrıca bir komut istemi parametresini options_for_select kullanan bir select_tag'e yapıştırarak aynı etkiyi elde edebileceğinizi de not etmeliyim ki bu muhtemelen bir nil nesnesiyle collection_select ile aynı cevabı verecektir.
elc

21

Seçili etiketlerin permütasyonları üzerinde oldukça zaman harcadım.

collection_selectbir nesne koleksiyonundan bir seçme etiketi oluşturur. Bunu akılda tutarak,

object: Nesnenin adı. Bu, etiketin adını oluşturmak için kullanılır ve seçilen değeri oluşturmak için kullanılır. Bu, gerçek bir nesne veya bir sembol olabilir - ikinci durumda, bu ismin örnek değişkeni, öğesinin bağlanmasındaActionController:post aranır (yani, @postdenetleyicinizde çağrılan bir örnek değişkenini arar .)

method: Yöntemin adı. Bu, etiketin adını oluşturmak için kullanılır. Başka bir deyişle, seçmeden almaya çalıştığınız nesnenin niteliği

collection : Nesnelerin koleksiyonu

value_method : Koleksiyondaki her nesne için, bu yöntem değer için kullanılır

text_method : Koleksiyondaki her nesne için bu yöntem ekran metni için kullanılır

Opsiyonel Parametreler:

options: Geçebileceğiniz seçenekler. Bunlar burada Seçenekler başlığı altında belgelenmiştir .

html_options: Burada geçirilen her ne ise, basitçe oluşturulan html etiketine eklenir. Bir sınıf, kimlik veya başka bir öznitelik sağlamak istiyorsanız, buraya gelir.

İlişkiniz şu şekilde yazılabilir:

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

Kullanımla ilgili olarak form_for, yine çok basit terimlerle, içindeki tüm etiketler için form_for, örn. f.text_field, ilk ( object) parametreyi sağlamanıza gerek yoktur . Bu form_forsözdiziminden alınmıştır .


2
Zaman ayırdığınız için teşekkürler ... Yine de tek sorun, dürüst olmak gerekirse, açıklamanızın kafamdaki şeyleri açıklığa kavuşturmaya yardımcı olmamasıdır. Gerçek tanımda birçok terimi kullandınız. Zaman ayırdığınız için minnettarım - bu yüzden oy verdim.
marcamillion

4
Marcamillion'un açıkça ifade ettiği nedenlerden ötürü red oyu verdim.
Jamie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.