我创建一个脚手架 -
rails g scaffold Contact email:string email_provider:string
但我想的电子邮件提供商是一个下拉(与Gmail /雅虎/ MSN的选项),而不是文本字段。 我怎样才能做到这一点 ?
我创建一个脚手架 -
rails g scaffold Contact email:string email_provider:string
但我想的电子邮件提供商是一个下拉(与Gmail /雅虎/ MSN的选项),而不是文本字段。 我怎样才能做到这一点 ?
你可以看看Rails的文档 。 不管怎么说,在你的表格:
<%= 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
新,创建和编辑方法,使用范围为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 %>
对于导轨形式,我也强烈建议你看一个表单生成像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)走了过来迁移文件,以检查它看起来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
请看看这里
要么你可以使用轨道标签或使用普通的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>
在你的模型,
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。
<%= f.select :email_provider, ["gmail","yahoo","msn"]%>