如何在轨道forms下拉<select>字段?

我正在创build一个脚手架 –

rails g scaffold Contact email:string email_provider:string 

但我希望电子邮件提供商是一个下拉(与Gmail /雅虎/ MSN作为选项),而不是一个文本字段。 我怎样才能做到这一点 ?

你可以看一下Rails文档 。 无论如何,在你的forms:

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

正如你所猜测的,你应该在另一个模型 – Provider者中预定义电子邮件提供Provider ,以便从哪里select。

或者为自定义选项

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

您在Contact控制器中创build集合 –

 app/controllers/contacts_controller.erb 

添加

 @providers = Provider.all.by_name 

到新的,创build和编辑方法,在Provider模型中使用by_name的范围 – app/models/provider.rb – 按名称sorting

 scope by_name order(:name) 

然后在视图 – app/views/contacts/_form.html.erb使用

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

对于rails窗体,我也强烈build议你看看像simple_form这样的表单生成器 – https://github.com/plataformatec/simple_form – 这将完成所有繁重的工作。

这是一个很长的路,但是如果你还没有实现,那么你最初可以这样创build你的模型。 下面的方法描述了改变现有的数据库。

1)为电子邮件提供商创build一个新模型:
$ rails g model provider name

2)这将使用名称string和时间戳创build您的模型。 它还创build了我们需要添加到模式的迁移:
$ rake db:migrate

3)添加迁移以将提供者ID添加到联系人:
$ rails g migration AddProviderRefToContacts provider:references

4)通过迁移文件检查它看起来OK,并迁移:
$ rake db:migrate

5)好的,现在我们有一个provider_id,我们不再需要原始的email_providerstring了:
$ 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)最后,我们需要自己添加提供者。 一种方法是使用种子文件:

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

$ rake db:seed

请看看这里

您可以使用rails标签或使用纯HTML标签

Rails标签

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

* 上面的代码行将成为HTML代码(HTML标签),find它下面*

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的第二个参数将select任何当前的email_provider。