¿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?
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
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
.
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