【问题标题】:How to use enum(rails 4.1)?如何使用枚举(rails 4.1)?
【发布时间】:2014-04-21 07:01:16
【问题描述】:

我正在尝试在我的项目中使用枚举。 但我不知道如何将它与 simple_form 输入集合一起使用。 我的代码出错了。 这是我在 user.rb 中的枚举定义:

    enum role: [ :guest, :super_admin, :advertiser, :publisher, :account_manager]

这是我的视图代码:

<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
    <%= render 'devise/shared/error_messages', object: f.object %>
    <div class="form-inputs">
       <%= f.input :name, required: true, autofocus: true%>
       <%= f.input :email, required: true %>
      <%= f.input :password, required: true, placeholder: "min. 6 characters",
                  input_html: {"parsley-minlength" => 6, "error-container" =>"#errorBlock"} %>
      <%= f.input :password_confirmation, required: true,
                  input_html: {"parsley-equalto" => "#user_password"} %>
      **<%= f.input :role, collection: User.roles %>**

    </div>

【问题讨论】:

标签: ruby-on-rails enums


【解决方案1】:

当您执行 Resource.roles 之类的操作时,它将返回键和值的散列,例如

{"guest"=>0, "super_admin"=>1, ...}

但是,如果您在表单中使用enum,默认情况下它将简单地显示一个整数字段。使用simple_form,您可以为enum 指定一个集合集,它将返回一个键数组。

<%= f.input :role, collection: User.roles.keys %>

由于您传入collection: 选项,它会自动将输入字段更改为选择。但是,您也可以使用 as: :select 手动指定此设置或使用复选框。

注意User.roles.keys会返回

["guest", "super_admin", ... ]

这应该可以解决您收到的错误消息。之前,它显示枚举名称,选择设置枚举的整数值。为枚举属性设置值时,您实际上指定的是键名,而不是整数值。

这是来自文档http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html#method-i-inherited

class Conversation < ActiveRecord::Base
  enum status: [ :active, :archived ]
end

# conversation.update! status: 0
conversation.active!
conversation.active? # => true
conversation.status  # => "active"

# conversation.update! status: 1
conversation.archived!
conversation.archived? # => true
conversation.status    # => "archived"

# conversation.update! status: 1
conversation.status = "archived"

# conversation.update! status: nil
conversation.status = nil
conversation.status.nil? # => true
conversation.status      # => nil

注意他们在哪里设置了状态conversation.status = "archived" 的值,他们设置了枚举的键名而不是值 1。希望这对您有所帮助。

【讨论】:

    【解决方案2】:

    正如我所见,User.roles 将不返回数组,但会返回类似 Hash 的

    {"guest"=>0, "super_admin"=>1, ...}
    

    我也不知道您的迁移,但请确保您在数据库中将角色字段作为整数而不是字符串。

    有关 Rails 枚举的更多详细信息,请参阅 official manual 和 this awesome article on enums by thoughtbot

    【讨论】:

      【解决方案3】:

      将此行添加到应用程序的 Gemfile:

      gem 'enum_help'
      

      然后执行:

      $ bundle
      

      在模型中

       enum role: [ :guest, :super_admin, :advertiser, :publisher, :account_manager]
      

      在 _form.html.erb 中使用 simple_form:

      <%= f.input :role %>
      

      欲了解更多信息:https://github.com/zmbacker/enum_help

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-18
        • 2014-05-22
        • 2016-08-02
        • 2014-02-08
        • 1970-01-01
        • 2014-07-04
        相关资源
        最近更新 更多