誰かがcollection_selectを明確で簡単な言葉で私に説明できますか?


146

私はRails APIのドキュメントを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、およびa Planはに属しているUser)を使用して、構文で使用したいものとその理由を説明できますか?

編集1:また、form_helperフォーム内または通常のフォーム内でどのように機能するかを説明すると、すばらしいでしょう。これを、Web開発を理解しているがRailsに対して「比較的新しい」Web開発者に説明しているとします。どのように説明しますか?


50
はい。それは私が今まで見た中で最もひどいドキュメントです
Jaseem

1
公平を期すために、ドキュメントはかなりOK、だけではないですFormBuilderが、中FormOptionsHelperapi.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構造の最も良い説明の1つです。基本的なRails構造とともに明確な言語を使用して、それを固めました。どうもありがとう!!
マルカミリオン2012年

2
なぜ「post [author_id]」という名前を付けるのですか?
Jaseem

@alexkvありがとうございました-:post、#フィールドの名前空間と:author_id、#フィールド名のパラメータ(最初の2つ)の重要性について詳しく説明していただけますか-スキームの目的がわかりません-できます 'それらは省略されますか?
BKSpurgeon

1
最初のパラメーターは実際にはnilにすることができます。オブジェクトフォームを作成している場合は、そのオブジェクトになるため、selectはフォームの他の部分と同じ名前空間を持ちます。それが必要ない場合は、1番目をnilのままにします。2番目はコントロールの名前であるため、オブジェクトのフィールドを更新する場合(1番目のパラメーター)、フィールド名は2番目のパラメーターです。他の用途のためにフォームを作成する場合、2番目のパラメーターは、フォームコントロールに名前を付け、IDを付けたいものです。なぜこれをnil 1stで使うのですか?おそらく:promptオプションにcollection_selectが必要なためです。
elc

1
また、options_for_selectを使用しているselect_tagにプロンプ​​トパラメータを追加するのと同じ効果が得られることにも注意してください。
elc

21

私自身、selectタグの順列にかなりの時間を費やしました。

collection_selectオブジェクトのコレクションから選択タグを作成します。これを念頭に置いて、

object:オブジェクトの名前。これは、タグの名前を生成するために使用され、選択された値を生成するために使用されます。これは実際のオブジェクトまたはシンボルにすることができます。後者の場合、その名前のインスタンス変数はのバインディングでActionController:post検索されます(つまり@post、コントローラーで呼び出されたインスタンス変数を検索します)。

method:メソッドの名前。これは、タグの名前を生成するために使用されます。つまり、選択から取得しようとしているオブジェクトの属性

collection :オブジェクトのコレクション

value_method :コレクション内の各オブジェクトについて、このメソッドは値に使用されます

text_method :コレクション内の各オブジェクトについて、このメソッドはテキストの表示に使用されます

オプションのパラメーター:

options:渡すことができるオプション。これらは、「オプション」という見出しの下のここに記載されています。

html_options:ここで渡されたものは何でも、単に生成されたhtmlタグに追加されます。クラス、ID、またはその他の属性を指定する場合は、ここに入力します。

あなたの協会は次のように書くことができます:

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 2012年

4
マルカミリオンがそのように明確に述べた理由により、私は反対票を投じました。
ジェイミー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.