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ć ?
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ć .
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']%>
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.
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
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>
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.
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