Я создаю эшафот -
rails g scaffold Contact email:string email_provider:string
но я хочу, чтобы поставщик электронной почты был выпадающим (с параметрами gmail/yahoo/msn в качестве параметров), а не текстовым полем. Как я могу это сделать?
Я создаю эшафот -
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
, чтобы иметь, где их выбрать.
Или для пользовательских опций
<%= 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) Хорошо, теперь у нас есть provider_id, нам больше не нужна оригинальная строка email_provider: $ 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 tag, либо использовать обычные теги HTML
Тег Rails
<%= 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 будет выбран текущий текущий email_provider.
<%= f.select :email_provider, ["gmail","yahoo","msn"]%>
Rails раскрываются с использованием ассоциации has_many для статьи и категории:
has_many :articles
belongs_to :category
<%= form.select :category_id,Category.all.pluck(:name,:id),{prompt:'select'},{class: "form-control"}%>