ruby on rails - rails - ¿Cómo tener un campo desplegable<select> en una forma de rieles?
select in ruby on rails (6)
En tu modelo,
class Contact
self.email_providers = %w[Gmail Yahoo MSN]
validates :email_provider, :inclusion => email_providers
end
En tu forma,
<%= f.select :email_provider,
options_for_select(Contact.email_providers, @contact.email_provider) %>
el segundo arg de options_for_select tendrá seleccionado cualquier actual_servidor_electrónico.
Estoy creando un andamio
rails g scaffold Contact email:string email_provider:string
pero quiero que el proveedor de correo electrónico sea un menú desplegable (con gmail / yahoo / msn como opciones) y no un campo de texto. Cómo puedo hacer esto ?
Este es un largo camino, pero si aún no lo ha implementado, puede crear originalmente sus modelos de esta manera. El siguiente método describe la modificación de una base de datos existente.
1) Crea un nuevo modelo para los proveedores de correo electrónico:
$ rails g model provider name
2) Esto creará su modelo con una cadena de nombre y marcas de tiempo. También crea la migración que debemos agregar al esquema con:
$ rake db:migrate
3) Agregue una migración para agregar la identificación de los proveedores en el contacto:
$ rails g migration AddProviderRefToContacts provider:references
4) Revise el archivo de migración para verificar que se vea bien y migre eso también:
$ rake db:migrate
5) De acuerdo, ahora tenemos un provider_id, ya no necesitamos la cadena de email_provider original:
$ rails g migration RemoveEmailProviderFromContacts
6) Dentro del archivo de migración, agregue el cambio que se verá algo así como:
class RemoveEmailProviderFromContacts < ActiveRecord::Migration
def change
remove_column :contacts, :email_provider
end
end
7) Una vez hecho esto, migre el cambio:
$ rake db:migrate
8) Aprovechemos este momento para actualizar nuestros modelos:
Contacto: belongs_to :provider
Proveedor: has_many :contacts
9) Luego, configuramos la lógica desplegable en _form.html.erb parcial en las vistas:
<div class="field">
<%= f.label :provider %><br>
<%= f.collection_select :provider_id, Provider.all, :id, :name %>
</div>
10) Por último, tenemos que agregar los propios verificadores. Una forma de hacerlo es utilizar el archivo semilla:
Provider.destroy_all
gmail = Provider.create!(name: "gmail")
yahoo = Provider.create!(name: "yahoo")
msn = Provider.create!(name: "msn")
$ rake db:seed
O para opciones personalizadas
<%= f.select :desired_attribute, [''option1'', ''option2'']%>
Por favor, eche un vistazo here
O puede usar la etiqueta de los rieles O usar las etiquetas de HTML sin formato
Etiqueta de carriles
<%= select("Contact", "email_provider", Contact::PROVIDERS, {:include_blank => true}) %>
* encima de la línea de código se convertiría en código HTML (etiqueta HTML), encuéntrelo debajo *
Etiqueta HTML
<select name="Contact[email_provider]">
<option></option>
<option>yahoo</option>
<option>gmail</option>
<option>msn</option>
</select>
Puede echar un vistazo a la documentación de Rails . De todos modos, en tu forma:
<%= f.collection_select :provider_id, Provider.order(:name),:id,:name, include_blank: true %>
Como puede adivinar, debe predefinir los proveedores de correo electrónico en otro modelo - Provider
, para tener dónde seleccionarlos.
Usted crea la colección en el controlador de Contact
-
app/controllers/contacts_controller.erb
Añadiendo
@providers = Provider.all.by_name
al nuevo, cree y edite métodos, usando un alcance para by_name
en el modelo de Provider
- app/models/provider.rb
- para ordenar por nombre
scope by_name order(:name)
Luego, en la vista - app/views/contacts/_form.html.erb
- usted usa
<%= f.collection_select :provider_id, @providers, :id, :name, include_blank: true %>
Para los formularios de rieles, también recomiendo encarecidamente que consulte un generador de formularios como simple_form - https://github.com/plataformatec/simple_form - que hará todo el trabajo pesado.