Может кто-нибудь объяснить мне collection_select в ясных и простых терминах? - PullRequest
125 голосов
/ 18 января 2012

Я просматриваю документы по 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)

Может кто-нибудь объяснить, используя простую ассоциацию (скажем, User has_many Plans, а Plan принадлежит User), что я хочу использовать в синтаксисе и почему?

Edit 1: Также было бы здорово, если бы вы объяснили, как это работает внутри form_helper или обычной формы. Представьте, что вы объясняете это веб-разработчику, который понимает веб-разработку, но является «относительно новым» для Rails. Как бы вы это объяснили?

Ответы [ 2 ]

273 голосов
/ 18 января 2012
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

19 голосов
/ 18 января 2012

Я потратил довольно много времени на перестановку тегов выбора.

collection_select создает тег выбора из коллекции объектов.Помня об этом,

object: название объекта.Это используется для генерации имени тега и для генерации выбранного значения.Это может быть реальный объект или символ - в последнем случае переменная экземпляра с таким именем ищется в привязке ActionController (то есть :post ищет экземплярВ вашем контроллере var вызывается @post.)

method: название метода.Это используется для генерации имени тега. Другими словами, атрибут объекта, который вы пытаетесь получить из select

collection: Коллекция объектов

value_method: для каждого объекта в коллекции этот метод используется для значения

text_method: для каждого объекта в коллекции этот метод используется для отображения текста

Необязательные параметры:

options: параметры, которые вы можете передать.Они задокументированы здесь под заголовком Опции.

html_options: все, что здесь передано, просто добавляется к сгенерированному тегу html.Если вы хотите указать класс, идентификатор или любой другой атрибут, он указывается здесь.

Ваша ассоциация может быть записана как:

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

Что касаетсяиспользуя form_for, опять же в очень простых терминах, для всех тегов, которые входят в form_for, например.f.text_field, вам не нужно указывать первый (object) параметр.Это взято из синтаксиса form_for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...