Ich erstelle ein Gerüst -
rails g scaffold Contact email:string email_provider:string
Ich möchte jedoch, dass der E-Mail-Anbieter ein Dropdown-Menü (mit Google Mail / Yahoo / MSN als Optionen) und kein Textfeld ist. Wie kann ich das machen ?
Ich erstelle ein Gerüst -
rails g scaffold Contact email:string email_provider:string
Ich möchte jedoch, dass der E-Mail-Anbieter ein Dropdown-Menü (mit Google Mail / Yahoo / MSN als Optionen) und kein Textfeld ist. Wie kann ich das machen ?
Sie können sich die Rails-Dokumentation ansehen . Wie auch immer, in Ihrer Form:
<%= f.collection_select :provider_id, Provider.order(:name),:id,:name, include_blank: true %>
Wie Sie sich vorstellen können, sollten Sie E-Mail-Anbieter in einem anderen Modell vordefinieren, um herauszufinden Provider
, wo Sie sie auswählen können.
app/views/contacts
, finden Sie eine Datei_form.html.erb
. Sie können versuchen, es dort zu platzieren. Diese "Teilansicht" ist für das Erstellen und Aktualisieren von Aktionen des von Ihnen generierten Gerüsts zuständig.Oder für benutzerdefinierte Optionen
<%= f.select :desired_attribute, ['option1', 'option2']%>
quelle
Sie erstellen die Sammlung im
Contact
Controller -Hinzufügen
@providers = Provider.all.by_name
zu den neuen Methoden erstellen und bearbeiten, wobei ein Bereich für die
by_name
imProvider
Modell -app/models/provider.rb
- für die Reihenfolge nach Namen verwendet wirdscope by_name order(:name)
Dann in der Ansicht -
app/views/contacts/_form.html.erb
- verwenden Sie<%= f.collection_select :provider_id, @providers, :id, :name, include_blank: true %>
Für Schienenformulare empfehle ich außerdem dringend, dass Sie sich einen Formularersteller wie simple_form ( https://github.com/plataformatec/simple_form) ansehen, der das gesamte schwere Heben übernimmt.
quelle
Dies ist ein langer Weg, aber wenn Sie noch nicht implementiert haben, können Sie Ihre Modelle ursprünglich auf diese Weise erstellen. Die folgende Methode beschreibt das Ändern einer vorhandenen Datenbank.
1) Erstellen Sie ein neues Modell für die E-Mail-Anbieter:
$ rails g model provider name
2) Dadurch wird Ihr Modell mit einer Namenszeichenfolge und Zeitstempeln erstellt. Außerdem wird die Migration erstellt, die wir dem Schema hinzufügen müssen mit:
$ rake db:migrate
3) Fügen Sie eine Migration hinzu, um die Anbieter-ID zum Kontakt hinzuzufügen:
$ rails g migration AddProviderRefToContacts provider:references
4) Gehen Sie die Migrationsdatei durch, um zu überprüfen, ob sie in Ordnung ist, und migrieren Sie auch diese:
$ rake db:migrate
5) Okay, jetzt haben wir eine provider_id, wir brauchen nicht mehr die ursprüngliche email_provider-Zeichenfolge:
$ rails g migration RemoveEmailProviderFromContacts
6) Fügen Sie in der Migrationsdatei die Änderung hinzu, die ungefähr so aussieht:
class RemoveEmailProviderFromContacts < ActiveRecord::Migration def change remove_column :contacts, :email_provider end end
7) Migrieren Sie anschließend die Änderung:
$ rake db:migrate
8) Nehmen wir uns diesen Moment Zeit, um unsere Modelle zu aktualisieren:
Kontakt:
belongs_to :provider
Anbieter:
has_many :contacts
9) Dann richten wir die Dropdown-Logik im Teil _form.html.erb in den Ansichten ein:
<div class="field"> <%= f.label :provider %><br> <%= f.collection_select :provider_id, Provider.all, :id, :name %> </div>
10) Schließlich müssen wir die Prüfer selbst hinzufügen. Eine Möglichkeit, dies zu tun, wäre die Verwendung der Seed-Datei:
Provider.destroy_all gmail = Provider.create!(name: "gmail") yahoo = Provider.create!(name: "yahoo") msn = Provider.create!(name: "msn")
$ rake db:seed
quelle
<%= f.select :email_provider, ["gmail","yahoo","msn"]%>
quelle
Bitte schauen Sie hier
Entweder können Sie Rails-Tags verwenden oder einfache HTML-Tags
Schienen-Tag
<%= select("Contact", "email_provider", Contact::PROVIDERS, {:include_blank => true}) %>
* Über der Codezeile wird HTML-Code (HTML-Tag). Finden Sie ihn unten. *
HTML-Tag
<select name="Contact[email_provider]"> <option></option> <option>yahoo</option> <option>gmail</option> <option>msn</option> </select>
quelle
In Ihrem Modell
class Contact self.email_providers = %w[Gmail Yahoo MSN] validates :email_provider, :inclusion => email_providers end
In Ihrer Form,
<%= f.select :email_provider, options_for_select(Contact.email_providers, @contact.email_provider) %>
Für das zweite Argument von options_for_select wird ein aktueller email_provider ausgewählt.
quelle
Schienen werden mithilfe der Zuordnung has_many für Artikel und Kategorie abgelegt:
has_many :articles belongs_to :category <%= form.select :category_id,Category.all.pluck(:name,:id),{prompt:'select'},{class: "form-control"}%>
quelle