2012-01-18 23 views
116

collection_select için Rails API'sı dokümanlarından geçiyorum ve onlar çok kötü.KoleksiyonSatışımı bana açık, basit terimlerle açıklayabilir mi?

başlığı şudur:

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

Ve bu verdikleri tek örnek kod:

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

birisi basit bir ilişki kullanılarak, açıklayabilir (diyelim bir User Has_many Plans ve Plan, User'a aittir), sözdiziminde kullanmak istediklerim ve neden?

Düzenleme 1: Ayrıca, bir form_helper veya düzenli bir form içinde nasıl çalıştığını açıkladıysanız, harika olurdu. Bunu web geliştirmeyi anlayan bir web geliştiricisine açıkladığınızı, ancak Rails'e 'nispeten yeni' olduğunu düşünün. Bunu nasıl açıklarsınız?

+37

Evet. Bu, şimdiye kadar gördüğüm en korkunç belgelerdir – Jaseem

+0

Fuarda olmak için, dokümantasyon oldukça iyi, sadece 'FormBuilder' değil, 'FormOptionsHelper' içinde değil: http://api.rubyonrails.org/classes/ActionView/Helpers /FormOptionsHelper.html#method-i-collection_select – amiuhle

+1

Favori formum, bir formda collection_select kullandığınız ve nesnenin parametre listesinin bir parçası olmaması için tüm imzayı değiştirdiği, ancak bunun yerine collection_select nesnesinde bir yöntem olarak çağrıldığı zamandır . Dokümanlarda bunu söylemediklerini sanmıyorum ... – user3670743

cevap

242
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 örnek aşağıdaki kodu olarak temsil edilebilir: Bu FormBuilder belgelenmiştir

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

ancak FormOptionsHelper

+25

Bu, kolayca gördüğüm karmaşık bir Rails yapısının en iyi açıklamalarından biridir. Net bir dil kullandınız ve onu güçlendirmek için temel Rails yapıları kullandınız. Çok teşekkürler!! – marcamillion

+1

Keşke bu oyunu bir defadan fazla oynatabilseydim. – marcamillion

+2

Neden "post [author_id]" yazdınız? – Jaseem

16

I üzerinde oldukça uzun bir zaman geçirdim seçim etiketlerinin permütasyonları kendim.

collection_select, bir nesne koleksiyonundan 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 ya da bir sembol olabilir - ikinci durumda, bu isimde örneği değişken looked for in the binding of the ActionController (. O :post bir örnek var controller içerisinde @post denilen arar olan)

method geçerli: İsim yöntem. Bu, diğer bir deyişle .. etiketin adını oluşturmak için kullanılan, seçili

collection almak çalıştığınız nesnenin özellik: nesneler

value_method

toplanması: Her nesne için toplama, bu yöntem

text_method değeri

için kullanılır:

: koleksiyonunda her nesne için, bu yöntem, metin için görüntüleme

İsteğe bağlı parametreleri kullanılıroptions: Geçirebileceğiniz seçenekler. Bunlar Seçenekler başlığı altında here belgelenmiştir.

html_options: Burada geçenler, oluşturulan html etiketine eklenir. Bir sınıf, kimlik veya başka bir özellik sağlamak istiyorsanız buraya gider.örneğin form_for giren tüm etiketler için çok basit terimlerle yine form_for kullanarak getirmedi

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

:

Sizin dernek olarak yazılmış olabilir. f.text_field, ilk (object) parametresini sağlamanız gerekmez. Bu, form_for sözdiziminden alınmıştır.

+2

Zaman ayırdığınız için teşekkürler ... tek sorun olsa da, bütün dürüstlükte, açıklamanız kafamdaki şeyleri açıklığa kavuşturmaya yardımcı olmaz. Gerçek tanımda çok fazla terim kullandınız. Zaman ayırdığınız için minnettarım - bu yüzden, oy verdim. – marcamillion

+2

marcamillion tarafından açıkça belirtilen nedenlerden ötürü, onu reddettim. – Jamie

İlgili konular