我正在创建一个脚手架-
rails g scaffold Contact email:string email_provider:string
但我希望电子邮件提供商是下拉列表(使用gmail / yahoo / msn作为选项),而不是文本字段。我怎样才能做到这一点 ?
Answers:
您可以看一下Rails文档。无论如何,以您的形式:
<%= f.collection_select :provider_id, Provider.order(:name),:id,:name, include_blank: true %>
如您所料,您应该在另一个模型中预定义电子邮件提供者- Provider
,以便在哪里选择它们。
app/views/contacts
,就会找到一个文件_form.html.erb
。您可以尝试将其放置在此处。该“局部视图”负责创建和更新您生成的支架的动作。
您在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
请在这里看看
您可以使用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>