web-dev-qa-db-ja.com

Railsフォームに<select>フィールドをドロップダウンする方法は?

足場を作成しています-

Rails g scaffold Contact email:string email_provider:string 

しかし、メールプロバイダーはテキストフィールドではなく、ドロップダウン(オプションとしてgmail/yahoo/msnを使用)にする必要があります。これどうやってするの ?

71
iCyborg

Rails documentation をご覧ください。とにかく、あなたのフォームで:

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

ご想像のとおり、別のモデル-Providerで電子メールプロバイダーを事前定義して、そこから選択する場所を確保する必要があります。

83
R Milushev

またはカスタムオプション用

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

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 のようなフォームビルダーを確認することを強くお勧めします。

15
Michael Durrant

これは長い道のりですが、まだ実装していない場合は、元々この方法でモデルを作成できます。以下の方法では、既存のデータベースの変更について説明します。

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

8
phobos

ご覧ください こちら

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>
3

モデルでは、

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が選択されています。

3
konyak

記事とカテゴリにhas_manyアソシエーションを使用したRailsドロップダウン:

has_many :articles

belongs_to :category

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

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

0
gsumk