ruby on rails - remote - ¿Puede alguien explicar collection_select en términos claros y simples?
select in rails 5 (2)
Estoy revisando los documentos de 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 muestra que dan:
collection_select(:post, :author_id, Author.all, :id, :name_with_initial, :prompt => true)
¿Alguien puede explicar, usando una asociación simple (digamos un User
muchos Plans
, y un Plan
pertenece a un User
), lo que quiero usar en la sintaxis y por qué?
Edición 1: Además, sería increíble si explicaras cómo funciona dentro de form_helper
o en una forma 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?
He pasado bastante tiempo con las permutaciones de las etiquetas de selección.
collection_select
crea una etiqueta de selección de una colección de objetos. Teniendo esto en mente,
object
: Nombre del objeto. Esto se usa para generar el nombre de la etiqueta y se usa para generar el valor seleccionado. Este puede ser un objeto real o un símbolo; en este último caso, la variable de instancia de ese nombre se busca en el enlace del ActionController
(es decir @post
:post
busca una var de instancia llamada @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 de la selección
collection
: la colección de objetos
value_method
: para cada objeto en la colección, este método se usa para valor
text_method
: para cada objeto en la colección, este método se usa para mostrar texto
Parámetros opcionales:
options
: opciones que puede pasar. Estos están documentados here , bajo el encabezado Opciones.
html_options
: lo que se pase 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 podría escribirse como:
collection_select(:user, :plan_ids, Plan.all, :id, :name, {:prompt => true, :multiple=>true })
Con respecto al uso de form_for
, nuevamente en términos muy simples, para todas las etiquetas que vienen dentro de form_for
, por ej. f.text_field
, no necesita proporcionar el primer parámetro ( object
). Esto se toma de la sintaxis de form_for
.
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 representarse 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 FormBuilder
, sino en api.rubyonrails.org/classes/ActionView/Helpers/…