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