2014-04-21 50 views
3

我想在我的項目中使用枚舉。 但我不知道如何使用它與simple_form輸入集合。 我的代碼犯了一個錯誤。 這是user.rb我的枚舉定義:如何使用枚舉(rails 4.1)?

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

沒有。可用於像gem'enumerize'和https://github.com/adzap/active_enum或https://github.com/jeffp/enumerated_attribute這樣的rails中使用枚舉功能的gems,請查看這些。 –

回答

0

正如我所看到的,User.roles將不返回數組但將返回像

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

散列此外,我不知道你的遷移,但要確保你有角色字段在數據庫中的整數,而不是一個字符串。

有關Rails的枚舉更多詳情,請參閱該official manualthis awesome article on enums by thoughtbot

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

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