Rails select_tag/带有枚举的下拉菜单

问题描述 投票:0回答:4

我有一个模型 Lead,它有一个 Status 字段,该字段通过枚举由多个值组成。

enum status: { open: 0, closed: 1, qualified: 2, rejected: 3 }

我正在尝试创建一个选择字段(在表中),其中新状态将通过 ajax 保存。有人可以帮助我创建 select_tag,在线我可以找到有效的枚举,但因为我既有 ID 又有值,所以有点复杂。

此时我有这样的东西,虽然它不起作用:

  <tbody>
    <% @leads.each do |lead| %>
    <tr class="<%=cycle('odd', 'even') %> location_row" id="lead_row" data-id="<%= lead.id%>">
      <td><%= lead.id %></td>
      <td><%= lead.fullname %></td>
      <td><%= lead.email %></td>
      <td><%= lead.phone %></td>
      <td><%= select_tag :Status, Lead.statuses.keys.to_a %></td> #trying this, without luck
      <td><%= select_tag :Status, Lead.statuses.keys.to_a.map { |w, v| [w.titleize, v] }%></td> #2nd try, without luck
      <td><%= link_to (fa_icon "pencil-square-o "), edit_lead_path({:id => lead.id, :first_last_name => lead.first_last_name}), :title => 'Edit Lead', :class => "action-button" %></td>
    </tr>
    <% end %>
  </tbody>

谢谢, T

ruby-on-rails drop-down-menu enums
4个回答
39
投票

我自己通过反复试验找到了答案。

<%= select_tag :status, options_for_select(Lead.statuses.map {|k, v| [k.humanize.capitalize, v]}) %>

16
投票

您可以使用以下代码来选择状态枚举作为选项:

<%= select_tag :status, options_for_select(Lead.statuses) %>


8
投票

两个答案都很好,但它们总是显示枚举选项的默认列表。

如果您希望下拉列表显示已存在的值(例如,在现有记录的编辑表单中),请将现有值作为第二个参数添加到

options_for_select
:

<%= f.select :access_level, options_for_select(Lead.statuses.map { |key, value| 
    [key.capitalize, value]
  }, @lead.status) %>

而且在许多情况下

key.humanize
是比
key.capitalize
更好的选择,因为它将下划线变成空格。


0
投票

对于那些寻找翻译选项的人,请创建一个助手:

module ApplicationHelper
  def options_for_enum(model_class, enum)
    enum_hash = model_class.send(enum.to_s.pluralize)

    enum_hash.map do |key, value|
      [model_class.human_attribute_name("#{enum}.#{key}"), value]
    end
  end
end

并使用它传递模型和枚举的名称

<%= form.select :status, options_for_enum(Lead, :status) %>

以同样的方式添加翻译rails国际化建议

en:
  activerecord:
    attributes:
      lead/status:
        open: Open
        closed: Closed
        qualified: Qualified
        rejected: Rejected
© www.soinside.com 2019 - 2024. All rights reserved.