Подтвердить что ты не робот

Как иметь выпадающее поле <select> в форме рельсов?

Я создаю эшафот -

rails g scaffold Contact email:string email_provider:string 

но я хочу, чтобы поставщик электронной почты был выпадающим (с параметрами gmail/yahoo/msn в качестве параметров), а не текстовым полем. Как я могу это сделать?

4b9b3361

Ответ 1

Вы можете посмотреть документацию Rails. В любом случае, в вашей форме:

  <%= f.collection_select :provider_id, Provider.order(:name),:id,:name, include_blank: true %>

Как вы можете догадаться, вы должны предопределить поставщиков электронной почты в другой модели - Provider, чтобы иметь, где их выбрать.

Ответ 2

Или для пользовательских опций

<%= f.select :desired_attribute, ['option1', 'option2']%>

Ответ 3

Вы создаете коллекцию в контроллере 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 - который будет выполнять все тяжелые операции.

Ответ 4

Это долгий путь, но если вы еще не реализовали, вы можете первоначально создать свои модели таким образом. Ниже описан способ изменения существующей базы данных.

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

Ответ 5

Пожалуйста, посмотрите здесь

Либо вы можете использовать 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>

Ответ 6

В вашей модели

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.

Ответ 7

<%= f.select :email_provider, ["gmail","yahoo","msn"]%>

Ответ 8

Rails раскрываются с использованием ассоциации has_many для статьи и категории:

has_many :articles

belongs_to :category

<%= form.select :category_id,Category.all.pluck(:name,:id),{prompt:'select'},{class: "form-control"}%>