8 回答
You can take a look at the Rails documentation . Anyways , in your form :
<%= f.collection_select :provider_id, Provider.order(:name),:id,:name, include_blank: true %>
As you can guess , you should predefine email-providers in another model -Provider
, to have where to select them from .
或用于自定义选项
<%= 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 %>
对于 rails 表单,我还强烈建议您查看 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)检查迁移文件以检查它是否正常,并且也迁移它:
$ 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
<%= f.select :email_provider, ["gmail","yahoo","msn"]%>
请看这里
您可以使用 rails 标签或使用纯 HTML 标签
导轨标签
<%= select("Contact", "email_provider", Contact::PROVIDERS, {:include_blank => true}) %>
*上面的代码行会变成 HTML 代码(HTML Tag),在下面找到它 *
HTML 标记
<select name="Contact[email_provider]">
<option></option>
<option>yahoo</option>
<option>gmail</option>
<option>msn</option>
</select>
Rails 使用文章和类别的 has_many 关联下拉:
has_many :articles
belongs_to :category
<%= form.select :category_id,Category.all.pluck(:name,:id),{prompt:'select'},{class: "form-control"}%>
在你的模型中,
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 的第二个参数将选择任何当前的 email_provider。