如何以rails形式下拉<select>字段?

iCy*_*org 74 ruby-on-rails input selectlist ruby-on-rails-3 drop-down-menu

我正在创建一个脚手架 -

rails g scaffold Contact email:string email_provider:string 
Run Code Online (Sandbox Code Playgroud)

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

R M*_*hev 86

您可以查看Rails文档.不管怎样,以你的形式:

  <%= f.collection_select :provider_id, Provider.order(:name),:id,:name, include_blank: true %>
Run Code Online (Sandbox Code Playgroud)

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

  • 建议将订单(:name)移动到模型中的范围(这是一种方法).这不是什么大不了的事,但随着时间的推移,你会发现在视图模板上拥有这样的业务逻辑(排序)会变得一团糟.将其移动到控制器,或理想的模型,并在那里使用可用的范围.一个例子 - 如果您最终得到三个使用下拉列表的屏幕或模板,则在视图中显示顺序意味着3 X重复.在模型中使用它意味着它被定义在一个地方,这是唯一改变它的地方,这是好的. (3认同)
  • 你的问题没问题。如果您查看一下 `app/views/contacts` 的结构,您会发现一个文件 `_form.html.erb`。你可以试着把它放在那里。这个“部分视图”负责创建和更新您生成的脚手架的操作。 (2认同)

Fdw*_*lis 44

或者用于自定义选项

<%= f.select :desired_attribute, ['option1', 'option2']%>
Run Code Online (Sandbox Code Playgroud)

  • <%= f.select:desired_attribute,options_for_select([['opt1'],['opt2']])这对我有用 (6认同)

Mic*_*ant 15

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

app/controllers/contacts_controller.erb 
Run Code Online (Sandbox Code Playgroud)

添加

@providers = Provider.all.by_name
Run Code Online (Sandbox Code Playgroud)

新,创建和编辑方法,使用了一个范围by_nameProvider模型- app/models/provider.rb-按名称排序

scope by_name  order(:name)
Run Code Online (Sandbox Code Playgroud)

然后在视图中app/views/contacts/_form.html.erb- 你使用

<%= f.collection_select :provider_id, @providers, :id, :name, include_blank: true %>
Run Code Online (Sandbox Code Playgroud)

对于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
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

10)最后,我们需要自己添加证明者.最好的方法是使用种子文件:

Provider.destroy_all

gmail = Provider.create!(name: "gmail")
yahoo = Provider.create!(name: "yahoo")
msn = Provider.create!(name: "msn")
Run Code Online (Sandbox Code Playgroud)

$ rake db:seed


小智 7

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

has_many :articles

belongs_to :category

<%= form.select :category_id,Category.all.pluck(:name,:id),{prompt:'select'},{class: "form-control"}%>
Run Code Online (Sandbox Code Playgroud)


gsu*_*umk 6

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


Rag*_*har 5

请看这里

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

Rails 标签

<%= select("Contact", "email_provider", Contact::PROVIDERS, {:include_blank => true}) %>
Run Code Online (Sandbox Code Playgroud)

*上面的代码行会变成 HTML 代码(HTML 标签),在下面找到它 *

HTML 标签

<select name="Contact[email_provider]">
  <option></option>
  <option>yahoo</option>
  <option>gmail</option>
  <option>msn</option>
</select>
Run Code Online (Sandbox Code Playgroud)