如何在轨道形式中有一个下拉字段?

问题描述 投票:68回答:8

我正在创建一个脚手架 -

rails g scaffold Contact email:string email_provider:string 

但我希望电子邮件提供商是一个下拉列表(使用gmail / yahoo / msn作为选项),而不是文本字段。我怎样才能做到这一点 ?

ruby-on-rails ruby-on-rails-3 drop-down-menu input selectlist
8个回答
82
投票

你可以看看the Rails documentation。不管怎样,以你的形式:

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

您可以猜测,您应该在另一个模型-Provider中预定义电子邮件提供程序,以便从中选择它们。


42
投票

或者用于自定义选项

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

14
投票

您在Contact控制器中创建集合 -

app/controllers/contacts_controller.erb 

添加

@providers = Provider.all.by_name

新的,创建和编辑方法,使用by_name模型中的Provider范围 - 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这样的表单构建器 - 它将完成所有繁重的工作。


8
投票

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

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)最后,我们需要自己添加提供者。最好的方法是使用种子文件:

Provider.destroy_all

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

$ rake db:seed


3
投票

请看看here

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

Rails标签

<%= 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的第二个arg将选择任何当前的email_provider。


0
投票

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


0
投票

Rails使用has_many关联下拉文章和类别:

has_many :articles

belongs_to :category

<%= form.select :category_id,Category.all.pluck(:name,:id),{prompt:'select'},{class: "form-control"}%>
© www.soinside.com 2019 - 2024. All rights reserved.