如何有一个下拉 在Rails表单字段? 如何有一个下拉 在Rails表单字段?(How to ha

2019-05-12 23:53发布

我创建一个脚手架 -

rails g scaffold Contact email:string email_provider:string 

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

Answer 1:

你可以看看Rails的文档 。 不管怎么说,在你的表格:

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

正如您可以猜到,你应该预先定义电子邮件提供商在另一种模式- Provider ,拥有从哪里选择。



Answer 2:

或自定义选项

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


Answer 3:

创建于收集Contact控制器-

app/controllers/contacts_controller.erb 

添加

@providers = Provider.all.by_name

新,创建和编辑方法,使用范围为by_nameProvider模型- 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 %>

对于导轨形式,我也强烈建议你看一个表单生成像simple_form - https://github.com/plataformatec/simple_form -这将尽一切繁重。



Answer 4:

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

1)创建的电子邮件提供商的新模式:
$ rails g model provider name

2)这将创建一个名称字符串和时间戳模型。 它还创建,我们需要添加带有架构迁移:
$ rake db:migrate

3)添加迁移到添加供应商ID为联系方式:
$ rails g migration AddProviderRefToContacts provider:references

4)走了过来迁移文件,以检查它看起来OK,并迁移过:
$ 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)最后,我们需要添加provders自己。 一种方式顶部做的是使用的种子文件:

Provider.destroy_all

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

$ rake db:seed



Answer 5:

请看看这里

要么你可以使用轨道标签或使用普通的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>


Answer 6:

在你的模型,

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。



Answer 7:

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



文章来源: How to have a drop down 举报