如何使用枚举(rails 4.1)?

时间:2014-04-21 07:01:16

标签: ruby-on-rails enums

我试图在我的项目中使用枚举。 但是我不知道如何在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>

3 个答案:

答案 0 :(得分:8)

当您执行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.希望这会对你有帮助。

答案 1 :(得分:0)

正如我所看到的,User.roles将不返回数组但会返回Hash之类的

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

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

有关Rails枚举的详细信息,请参阅official manualthis awesome article on enums by thoughtbot

答案 2 :(得分:-1)

将此行添加到您的应用程序的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