Я створюю риштування -
rails g scaffold Contact email:string email_provider:string
але я хочу, щоб постачальник послуг електронної пошти був випадаючим (із опціями gmail / yahoo / msn), а не текстовим полем. Як я можу це зробити?
Відповіді:
Ви можете поглянути на документацію Rails . У будь-якому випадку, у вашій формі:
<%= f.collection_select :provider_id, Provider.order(:name),:id,:name, include_blank: true %>
Як ви можете здогадатися, вам слід Provider
визначити постачальників послуг електронної пошти в іншій моделі - , щоб мати де їх вибрати.
app/views/contacts
, ви знайдете файл _form.html.erb
. Ви можете спробувати розмістити його там. Цей "частковий вигляд" відповідає як за створення, так і за оновлення дій створеного вами ешафоту.
Або для нестандартних параметрів
<%= f.select :desired_attribute, ['option1', 'option2']%>
Ви створюєте колекцію в Contact
контролері -
app/controllers/contacts_controller.erb
Додавання
@providers = Provider.all.by_name
до нових, створюйте та редагуйте методи, використовуючи область для by_name
в Provider
моделі - app/models/provider.rb
- для впорядкування за іменем
scope by_name order(:name)
Тоді в поданні - app/views/contacts/_form.html.erb
- ви використовуєте
<%= f.collection_select :provider_id, @providers, :id, :name, include_blank: true %>
Що стосується форм рейок, я також настійно рекомендую вам поглянути на конструктор форм, такий як simple_form - https://github.com/plataformatec/simple_form - який зробить усі важкі роботи.
Це довгий шлях, але якщо ви ще не впровадили його, ви можете спочатку створити свої моделі таким чином. Метод нижче описує зміну існуючої бази даних.
1) Створіть нову модель для постачальників послуг електронної пошти:
$ rails g model provider name
2) Це створить вашу модель із рядком імені та позначками часу. Він також створює міграцію, яку нам потрібно додати до схеми за допомогою:
$ rake db:migrate
3) Додайте міграцію, щоб додати ідентифікатор постачальника до контакту:
$ rails g migration AddProviderRefToContacts provider:references
4) Перейдіть до файлу міграції, щоб перевірити, чи виглядає він нормально, і перенесіть і це:
$ rake db:migrate
5) Гаразд, тепер у нас є ідентифікатор провайдера, нам більше не потрібен оригінальний рядок електронної_провайдера:
$ rails g migration RemoveEmailProviderFromContacts
6) Всередині файлу міграції додайте зміну, яка виглядатиме приблизно так:
class RemoveEmailProviderFromContacts < ActiveRecord::Migration
def change
remove_column :contacts, :email_provider
end
end
7) Після цього перенесіть зміни:
$ rake db:migrate
8) Візьмемо цей момент, щоб оновити наші моделі:
Контакт: belongs_to :provider
Постачальник:has_many :contacts
9) Потім ми встановлюємо логіку випадаючого списку в частковому _form.html.erb у поданнях:
<div class="field">
<%= f.label :provider %><br>
<%= f.collection_select :provider_id, Provider.all, :id, :name %>
</div>
10) Нарешті, нам потрібно додати самі постачальники. Одним із найкращих способів буде використання насіннєвого файлу:
Provider.destroy_all
gmail = Provider.create!(name: "gmail")
yahoo = Provider.create!(name: "yahoo")
msn = Provider.create!(name: "msn")
$ rake db:seed
Будь ласка, подивіться тут
Або ви можете використовувати тег rails, або використовувати звичайні теги HTML
Бірка рейок
<%= select("Contact", "email_provider", Contact::PROVIDERS, {:include_blank => true}) %>
* верхній рядок коду стане HTML-кодом (HTML-тегом), знайдіть його нижче *
Тег HTML
<select name="Contact[email_provider]">
<option></option>
<option>yahoo</option>
<option>gmail</option>
<option>msn</option>
</select>
У вашій моделі
class Contact
self.email_providers = %w[Gmail Yahoo MSN]
validates :email_provider, :inclusion => email_providers
end
У вашій формі
<%= f.select :email_provider,
options_for_select(Contact.email_providers, @contact.email_provider) %>
у другому аргументі options_for_select буде вибрано будь-який поточний постачальник_ електронної пошти.