Ruby on Rails:下拉菜单

时间:2009-12-24 01:06:11

标签: ruby-on-rails

我正在尝试创建一个下拉菜单,允许用户更改表格中的条目字段。用户有三个选项之一 - 热,中和冷。

我已经text_fields对其他字段做了基本相同的事情,当用户点击submit_tag时,所有字段都会更新。

是否有一种简单的方法可以实现下拉框并将结果与​​submit_tag一起保存?

感谢,

-Chris

6 个答案:

答案 0 :(得分:39)

这是基本答案。两个元素数组的数组是关键部分。

<% form_for @entry do |f| %>
  <%= f.text_field :name %>
  <%= f.select :temperature, [['Hot','hot'],['Medium','medium'],['Cold','cold']] %>
  <%= f.submit %>
<% end %>

答案 1 :(得分:23)

我会假设两件事:

  • 您是<%= form_for @model_instance成语(在this guide的第2.2节中解释过)。
  • 您希望将“热”,“中”和“冷”值存储为数据库中的字符串(而不是数字1,2和3或类似的东西)。

假设您有两个字段,名为:name:temperature,由两个text_fields控制:

<% form_for @article do |f| %>
  <%= f.text_field :name %>
  <%= f.text_field :temperature %>
  <%= f.submit "Create" %> <% end %>
<% end %>

现在您要将:温度控制更改为下拉列表,接受热,中,冷值。然后你可以这样做:

<% form_for @article do |f| %>
  <%= f.text_field :name %>
  <%= f.collection_select :temperature, Article::TEMPERATURES, :to_s, :to_s, 
       :include_blank => true
  %>
  <%= f.submit "Create" %> <% end %>
<% end %>

您现在必须在文章模型中定义Article::TEMPERATURES常量。这应该不是很困难:

class Article < Activerecord::Base

  TEMPERATURES = ['hot', 'medium', 'cold']

您可能想知道为什么我在:include_blank上添加了collection_select部分。这将在您的下拉列表中添加“空”选项。在创建新对象时,您将需要该空选项,除非您希望将“默认”值设置为温度。

答案 2 :(得分:3)

答案 3 :(得分:2)

我正在做类似的事情。我通过简单地在我的模型中添加枚举或常量(类似于之前的kikito所说的)然后在我的表单中调用select来实现这一点。

以下是它的工作原理。

使用常量:

class ClassName&lt;的ActiveRecord :: Base的   TEMPERATURES = [&#39; Hot&#39;,&#39; Medium&#39;&#39; Cold&#39;] 端

bin / rails g migration add_column_to_table temperature:string

_form.html.erb

<%= f.label :temperature %>
<%= f.select :temperature, ClassName::TEMPERATURE %>

使用枚举:

class ClassName&lt;的ActiveRecord :: Base的   枚温:[:hot,:medium,:cold] 端

bin / rails g migration add_column_to_table temperature:integer

_form.html.erb

<%= f.label :temperature %>
<%= f.select :temperature, ClassName.temperatures.keys %>

希望能帮到你!

答案 4 :(得分:1)

你可能想要考虑formtastic gem少得多的代码。

<% semantic_form_for @stuff do |f| %>  
   <% f.inputs do %>  
   <%= f.input :name %>  
   <%= f.input :temperature, :as => :select, 
               :label => "Degree", :include_blank => false,
               :collection => [["Hot", 1], ["Medium", 2], ["Cold", 3]] %>  
   <% end %>  
   <%= f.buttons %>    
<% end %>  

答案 5 :(得分:0)

根据以上所有答案,请记住最后这个重要步骤:

重新启动服务器

作为一个新手,我想知道为什么即使我正确地执行了所有步骤,我的阵列也无法正常工作。