¿Puede alguien explicarme collection select en términos claros y sencillos?


Estoy revisando los documentos de la API de Rails para collection_select y son horribles.

El encabezado es este:

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

Y este es el único código de ejemplo que dan:

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

¿Puede alguien explicar, usando una asociación simple (por ejemplo, a User has_many Plans, y a Plan pertenece a a User), lo que quiero usar en la sintaxis y por qué?

Edit 1: Además, sería increíble si explicaras cómo funciona dentro de un form_helper o una forma regular. Imagínate están explicando esto a un desarrollador web que entiende el desarrollo web, pero es 'relativamente nuevo' para Rails. ¿Cómo lo explicarías?

Author: hopper, 2012-01-18

2 answers

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

O su ejemplo puede ser representado como el siguiente código:

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

Esto no está documentado en el FormBuilder, pero en el FormOptionsHelper

 255
Author: alexkv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-27 16:07:07

He pasado bastante tiempo en las permutaciones de las etiquetas select.

collection_select crea una etiqueta select a partir de una colección de objetos. Teniendo esto en cuenta,

object : Nombre del objeto. Este se utiliza para generar el nombre de la etiqueta, y se utiliza para generar el valor seleccionado. Esto puede ser un objeto real, o un símbolo - en este último caso, la variable de instancia de ese nombre es buscado en el enlace de la ActionController (es decir, :post busca una instancia var llamado @post en su controlador.)

method : Nombre del método. Esto se usa para generar el nombre de la etiqueta.. En otras palabras, el atributo del objeto que está tratando de obtener del select

collection : La colección de objetos

value_method : Para cada objeto de la colección, este método se utiliza para value

text_method : Para cada objeto de la colección, este método se utiliza para mostrar texto

Parámetros opcionales:

options : Opciones que puedes pasar. Estos están documentados aquí, bajo el encabezado Opciones.

html_options : Cualquier cosa que se pase aquí, simplemente se agrega a la etiqueta html generada. Si desea proporcionar una clase, id, o cualquier otro atributo, va aquí.

Su asociación podría escribirse como:

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

Con respecto al uso de form_for, de nuevo en términos muy simples, para todas las etiquetas que vienen dentro de la form_for, por ejemplo. f.text_field, no es necesario proporcionar el primer parámetro (object). Este se toma de la sintaxis form_for.

 17
Author: zsquare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-26 13:50:17