足場を作成しています-
Rails g scaffold Contact email:string email_provider:string
しかし、メールプロバイダーはテキストフィールドではなく、ドロップダウン(オプションとしてgmail/yahoo/msnを使用)にする必要があります。これどうやってするの ?
Rails documentation をご覧ください。とにかく、あなたのフォームで:
<%= 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
Provider
モデルのby_name
のスコープ-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 %>
Railsフォームの場合、simple_form - https://github.com/plataformatec/simple_form のようなフォームビルダーを確認することを強くお勧めします。
これは長い道のりですが、まだ実装していない場合は、元々この方法でモデルを作成できます。以下の方法では、既存のデータベースの変更について説明します。
1)メールプロバイダーの新しいモデルを作成します。$ Rails g model provider name
2)これにより、名前文字列とタイムスタンプを使用してモデルが作成されます。また、次の方法でスキーマに追加する必要がある移行も作成します。$ rake db:migrate
3)移行を追加して、プロバイダーIDを連絡先に追加します。$ 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)最後に、プロバイダー自身を追加する必要があります。それを行う1つの方法は、シードファイルを使用することです。
Provider.destroy_all
gmail = Provider.create!(name: "gmail")
yahoo = Provider.create!(name: "yahoo")
msn = Provider.create!(name: "msn")
$ rake db:seed
ご覧ください こちら
Railsタグを使用するか、プレーンHTMLタグを使用するか
レールタグ
<%= 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の2番目の引数には、現在のemail_providerが選択されています。
記事とカテゴリにhas_manyアソシエーションを使用したRailsドロップダウン:
has_many :articles
belongs_to :category
<%= form.select :category_id,Category.all.pluck(:name,:id),{Prompt:'select'},{class: "form-control"}%>
<%= f.select :email_provider, ["gmail","yahoo","msn"]%>