Jak mieć pole rozwijane w formie rails?

Tworzę rusztowanie -

rails g scaffold Contact email:string email_provider:string 

Ale chcę, aby dostawca poczty e-mail był rozwijanym (z opcjami gmail / yahoo / msn), a nie polem tekstowym. Jak mogę to zrobić ?

Author: Matt, 2013-01-01

6 answers

Możesz rzucić okiem na dokumentację Rails. Tak czy inaczej, w Twojej formie:

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

Jak możesz się domyślić, powinieneś predefiniować dostawców poczty e-mail w innym modelu -Provider, aby mieć, z którego miejsca je wybrać .

 75
Author: R Milushev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-21 13:00:41

Lub dla opcji niestandardowych

<%= f.select :desired_attribute, ['option1', 'option2']%>
 34
Author: Fdwillis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-05 02:12:59

Tworzysz kolekcję w kontrolerze Contact -

app/controllers/contacts_controller.erb 

Dodawanie

@providers = Provider.all.by_name

Do nowej, Utwórz i edytuj metody, używając zakresu dla by_name w modelu Provider - app/models/provider.rb - Dla kolejności według nazwy

scope by_name  order(:name)

Następnie w widoku - app/views/contacts/_form.html.erb - używasz

<%= f.collection_select :provider_id, @providers, :id, :name, include_blank: true %>

W przypadku formularzy rails, zdecydowanie polecam spojrzeć na Kreator formularzy, taki jak simple_form- https://github.com/plataformatec/simple_form-który wykona wszystkie ciężkie roboty.

 13
Author: Michael Durrant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-01 21:04:08

To długa droga, ale jeśli jeszcze nie zaimplementowałeś, możesz oryginalnie tworzyć swoje modele w ten sposób. Poniższa metoda opisuje zmianę istniejącej bazy danych.

1) Utwórz nowy model dla dostawców poczty e-mail:
$ rails g model provider name

2) spowoduje to utworzenie modelu z łańcuchem nazw i znacznikami czasu. Tworzy również migrację, którą musimy dodać do schematu z:
$ rake db:migrate

3) Dodaj migrację, aby dodać identyfikator dostawcy do Kontakt:
$ rails g migration AddProviderRefToContacts provider:references

4) Przejdź do pliku migracji, aby sprawdzić, czy wygląda dobrze, i migracji, że zbyt:
$ rake db:migrate

5) Ok, teraz mamy provider_id, nie potrzebujemy już oryginalnego ciągu email_provider:
$ rails g migration RemoveEmailProviderFromContacts

6) wewnątrz pliku migracji dodaj zmianę, która będzie wyglądać mniej więcej tak:

class RemoveEmailProviderFromContacts < ActiveRecord::Migration
  def change
    remove_column :contacts, :email_provider
  end
end

7) po zakończeniu migracji zmiany:
$ rake db:migrate

8) poświęćmy ten moment, aby zaktualizować nasze modele:
Kontakt: belongs_to :provider
Dostawca: has_many :contacts

9) następnie ustawiamy rozwijaną logikę w formularzu _form.html.erb partial in the views:

  <div class="field">
    <%= f.label :provider %><br>
    <%= f.collection_select :provider_id, Provider.all, :id, :name %>
  </div>

10) na koniec musimy dodać same provdery. Jednym ze sposobów na zrobienie tego byłoby użycie pliku seed:

Provider.destroy_all

gmail = Provider.create!(name: "gmail")
yahoo = Provider.create!(name: "yahoo")
msn = Provider.create!(name: "msn")

$ rake db:seed

 8
Author: phobos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-01 11:53:36

Proszę zajrzeć TUTAJ

możesz użyć znacznika rails lub zwykłego znacznika HTML

Tag Rails

<%= select("Contact", "email_provider", Contact::PROVIDERS, {:include_blank => true}) %>

*powyższa linia kodu stanie się kodem HTML( znacznik HTML), znajdź go poniżej *

Znacznik HTML

<select name="Contact[email_provider]">
  <option></option>
  <option>yahoo</option>
  <option>gmail</option>
  <option>msn</option>
</select>
 3
Author: Raghvendra Parashar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-02 11:06:56

W twoim modelu,

class Contact
  self.email_providers = %w[Gmail Yahoo MSN]
  validates :email_provider, :inclusion => email_providers
end

W Twojej formie,

<%= f.select :email_provider, 
    options_for_select(Contact.email_providers, @contact.email_provider) %>

Druga arg opcji options_for_select będzie miała wybrany dowolny bieżący email_provider.

 3
Author: konyak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-16 20:33:59