2012-01-18 9 views
116

Estoy revisando los documentos de la API Rails para collection_select y son horribles.¿Alguien me puede explicar collection_select en términos claros y sencillos?

El título es el siguiente:

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, utilizando una simple asociación (por ejemplo un has_many UserPlans, y Plan pertenece a User), ¿qué quiero usar en la sintaxis y por qué?

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

+37

Sí. Esa es la documentación más horrible que he visto – Jaseem

+0

Para ser justos, la documentación está bastante bien, simplemente no en 'FormBuilder', sino en' FormOptionsHelper': http://api.rubyonrails.org/classes/ActionView/Helpers /FormOptionsHelper.html#method-i-collection_select – amiuhle

+1

Mi parte favorita es cuando usa collection_select en un formulario y eso cambia la firma completa para que el objeto no forme parte de la lista de parámetros, sino que se llama a collection_select como un método en el objeto . No creo que mencionen eso en los documentos ... – user3670743

Respuesta

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

O su ejemplo se puede representar 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 se documenta en el FormBuilder, pero en el FormOptionsHelper

+25

Esto es fácil, una de las mejores explicaciones de una compleja estructura de Rails que he visto. Usó un lenguaje claro, junto con las construcciones básicas de Rails para solidificarlo. ¡¡Muchas gracias!! – marcamillion

+1

Ojalá pudiera votar esto más de una vez. – marcamillion

+2

¿Por qué alguna vez lo llamarías "post [author_id]"? – Jaseem

16

He pasado bastante tiempo en las permutaciones de las etiquetas de selección yo mismo.

collection_select construye una etiqueta de selección de una colección de objetos. Teniendo esto en cuenta,

object: Nombre del objeto. Esto se usa para generar el nombre de la etiqueta y se usa 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 looked for in the binding of the ActionController (es decir, :post busca a una instancia var llama @post en su controlador.)

method: Nombre de la método. Esto se utiliza para generar el nombre de la etiqueta .. En otras palabras, el atributo del objeto que está tratando de llegar desde el selecto

collection: La colección de objetos

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

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

Parámetros opcionales:

options: opciones que puede pasar. Estos están documentados here, bajo el encabezado Opciones.

html_options: Todo lo que se transmite aquí, simplemente se agrega a la etiqueta html generada. Si desea proporcionar una clase, un id o cualquier otro atributo, aquí va.

Su asociación puede ser escrito como:

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

En lo que respecta a la utilización de form_for, de nuevo en términos muy sencillos, de todas las etiquetas que vienen dentro de la form_for, por ejemplo. f.text_field, no es necesario que proporcione el primer parámetro (object). Esto se toma de la sintaxis form_for.

+2

Gracias por tomarse el tiempo ... el único problema es, honestamente, su explicación no ayuda a aclarar las cosas en mi cabeza. Usaste muchos de los términos en la definición real. Sin embargo, aprecio que se tome el tiempo, así que para eso, lo voté. – marcamillion

+2

Por las razones tan claramente indicadas por marcamillion, lo voté. – Jamie

Cuestiones relacionadas