【问题标题】:Using enum with select in a form_tag在 form_tag 中使用 enum 和 select
【发布时间】:2016-09-04 04:47:58
【问题描述】:

user.rb

enum gender_type: [:male, :female] 
scope :gender, -> (gender_type) { where gender_type: gender_type}

用户控制器

@users = User.gender(params[:gender_type]).paginate(page: params[:page]) if params[:gender_type].present? 

index.html.erb

<%= form_tag users_path, method: :get do %>
  <%= select_tag   ??????                                         %>
  <%= submit_tag "Search", :name => "nil", :id => "submit-gender" %>
<% end %>

我们的目标是:

example.com/users?gender_type=0 或 example.com/users?gender_type=1

【问题讨论】:

    标签: ruby-on-rails enums


    【解决方案1】:

    要从枚举属性中获取映射,您可以use the pluralised version of the the enum attribute name:

    User. gender_types 
    => { male: 0, female: 1 } 
    

    您可以调用Hash.to_a 来获取可以传递给options_for_select 的对数组。但您可能想使用.map 来转换键。

    class User
      self.gender_options
        # or use the I18n module to humanize the keys
        self.gender_types.map { |k,v| [k.capitalize, v] }
      end
    end
    
    <%= select_tag 'gender', options_for_select(User.gender_options) %>
    

    【讨论】:

    • 谢谢。应该是self.gender_types.map:gender_type
    【解决方案2】:

    试试那种

    select_tag 'gender', "<option value=0>male</option><option value=1>female</option>".html_safe
    

    或类似的东西

    select_tag 'gender', options_for_select([["male",0],["female",1]])
    

    您可以阅读 rails api 来找到解决方案 http://apidock.com/rails/ActionView/Helpers/FormTagHelper/select_tag

    【讨论】:

    • 谢谢。是的,我有点好奇如何在不手动列出它们的情况下(如果可能的话)以供将来参考,因为下次可能有两个以上的选项。如果没有人提出这个答案,我会接受这个。
    【解决方案3】:

    (我假设您输入错误的文件名 users.rb 并且它是常规的 user.rb 模型)

    User.gender_types 将返回一个哈希值{"male" =&gt; 0, "female" =&gt; 1}。听起来很简单!

    select_tag :gender_type, options_for_select(User.gender_types)

    【讨论】:

    • 我收到此错误。 ActionView::Template::Error (undefined method statuses for #&lt;Class:0x007f4199c56660&gt;): 也应该是 :gender_type 而不是 :gender
    • 哦,对了,我的错,更新了答案。您需要将您传递的单词的复数版本称为enum。你想运行User.gender_types
    • 这导致{"male" =&gt; 0, "female" =&gt; 1} 被传递到选择选项中。最大解决了它。 :)
    • sigh 我应该在这里多加注意。又更新了答案,忘了options_for_select电话。
    【解决方案4】:

    你可以像这样简单地使用

    <%= form_for(user) do |form| %>
        <%= form.select :gender_types, User.gender_types.keys.to_a %>
    <% end %>
    

    但是假设你使用Rails Internationalization I18n(我推荐)你可能想在你的视图助手中翻译这个枚举(或者:

    # app/helpers/users_helper.rb
    def genders_select
      User.gender_types.map do |k,v|
        [User.human_enum_name(:gender_types, k), v]
      end
    end
    

    <%= form_for(user) do |form| %>
        <%= form.select :gender_types, @genders_select %>
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2014-01-09
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多