2014-06-12 3 views
9

Ruby on Rails 4.1형식에서 열거 형을 선택하여 역할을 설정하십시오.

저는 enum 역할을 가진 Devise를 사용하고 있습니다. 현재 사용자 생성시 기본 역할을 설정합니다. 열거 형 역할을 설정하기 위해 사용자를 생성하는 양식에 필드를 추가하고 싶습니다.

나는 this을 읽었지만 새로운 역할을 활용하는 방법은 밝히지 않았습니다.

<div class="form-group"> 
    <%= f.collection_select :role, User.roles, :id, :enum, {prompt: "Select a role"}, {class: "form-control input-lg"} %> 
</div> 

오류 :

이 내가 열거 역할을 선택하는 선택을하려고 양식의 일부인 사용자 클래스

devise :database_authenticatable, :registerable, :confirmable, 
    :recoverable, :rememberable, :trackable, :validatable 
enum role: [:user, :vip, :admin, :developer, :marketing, :support, :translator] 
after_initialize :set_default_role, :if => :new_record? 

def set_default_role 
    self.role ||= :user 
end 

입니다

NoMethodError - undefined method `enum' for ["user", 0]:Array: 
actionview (4.1.1) lib/action_view/helpers/form_options_helper.rb:761:in `value_for_collection' 

전에 열거 형을 사용한 적이 없으며 the documentation이 도움이되지 않습니다. 열거 옵션을 표시하려면 어떻게합니까?

답변

20

시작하려면 enum은 특성 이름이 아닙니다. 속성의 이름은 role입니다.

구체적 형태는 관리자가 사용자의 역할을 변경할 수 있도록 만듭니다 부분 파일 응용 프로그램/뷰/사용자/_user.html.erb 인의 rails-devise-pundit 예제 애플리케이션을 살펴보십시오. 헬퍼 용으로 collection_select을 사용하고 싶지는 않습니다 (별도의 역할 모델을 사용하는 경우 적합). 대신, 일반 select 양식 도우미가 작동합니다.

<%= f.select(:role, User.roles.keys.map {|role| [role.titleize,role]}) %> 

가 문 역할의 배열을 가져옵니다

여기
<%= f.select(:role, [['User', 'user'], ['Vip', 'vip'], ['Admin', 'admin']]) %> 

는 형태로 역할을 하드 코딩 피하는 좋은 예입니다 : 여기

는 역할 옵션을 하드 코드 간단한 예제 User 모델을 만들고 map 메서드를 사용하여 키 - 값 쌍의 배열을 구성합니다. 내가 collection_select enum와의를 사용하기 위해 함께 왔어요

+0

남은 유일한 일은 Devise :: RegistrationsController # create를 재정 의하여 지금 역할을 허용하는 것입니다. +1 – DDDD

+0

등록 컨트롤러를 무시할 필요가 없습니다. 응용 프로그램 컨트롤러에서이 작업을 수행 할 수 있습니다. 내 [Rails Devits Tutorial] (http://railsapps.github.io/rails-devise/) 또는 [Devise README] (https://github.com/plataformatec/devise)를 참조하십시오. –

+0

나는 그것이 게으른 방법이 아니라고 생각했다. 나는 before_filter와 함께 Users : RegistrationsController를 만들었습니다 : configure_permitted_parameters 그 sanitizer.for (: sign_up) 나는 그 코드를 게시하면 그것을 할 수있는 안전한 방법인지 알려주시겠습니까? – DDDD

3

가장 깨끗한 방법은 다음과 같다 :

f.collection_select :diet_preference, User.roles.map{ |dp| [dp.first, dp.first.humanize] }, :first, :second 
7

당신이 레일 4 이상을 사용하고 있기 때문에, 열거도 덜 복잡합니다.

는 다음 열거를 감안할 때 :

enum role: { 
    admin: 1 
} 

이 열거 형은 HTML 옵션 속성 value이 열거 열쇠가 될 것으로 기대 :

<option value="admin"> <!-- As opposed to: <option value="1"> --> 

이 알고, 당신은 열거 키에 전달할 수 있습니다.

<%= f.select :role, User.roles.keys, {}, class: 'user-roles-select' %> 

그런 다음 CSS를 사용하여 모양을 수정할 수 있습니다.

.user-roles-select option { 
    text-transform: capitalize; 
} 
1

다음은 국제화 및 순서 지정을 통해 수행 한 작업이며, 이미 정의 된 경우 current_user 역할을 자동 선택합니다. 카테고리 등 모든 열거 역할 포함 : 그것은 당신이 역할과 로케일 파일이 있다고 가정, 열거 형으로

# your locale file 
en: 
roles: 
    admin: "Administrator" 
    mode: "Moderator" 


# model user.rb 
enum role: { admin: 0, mode: 1 } 
ROLES = User.roles.map { |r,| [I18n.t("roles.#{r}"), r] }.sort_by { |r| I18n.t("roles.#{r}") } 

# view 

<%= f.select :role, User::ROLES, { prompt: t("users.roles.prompt"), selected: @user.role }, { class: "form-control" } %> 
0

가 레일에서 정수에 대한 래퍼입니다, 그리고 내가 대신 DB에 문자열을 저장하고 싶었 I 다음했다 : 내 양식에

class Child < ApplicationRecord 
     enum year: { 
      Infant: 'Infant', 
      '2-5_years': '2_to_5_years', 
      '5-8_years': '5_to_8_years', 
      '8-10_years': '8_to_10 years', 
      'More_than_10_years': 'More_than_10_years' 
     } 
     AGE_YEARS = Child.years.map { |k, v| [k.humanize, v] } 
    } 

,

<%= f.select :age, options_for_select(Child::AGE_YEARS, params[:age]), include_blank: 'Select an age-group.' %> 

내가 미리 정의 된 데이터 타입을 선언 할 수있어서, PostgreSQL 서버를 사용하고, 나는 '해'라는 컬럼을 추가 유형 '연도'의 하위 모델로

rails generate migration AddYearToChildren year:year 

다음과 같이 이전 파일을 변경했습니다.

class AddYearToChildren < ActiveRecord::Migration[5.0] 
    def up 
    execute <<-SQL 
     CREATE TYPE year AS ENUM ('Infant', '2_5_years', '5_8_years', '8_10_years', 'More_than_10_years'); 
    SQL 
    add_column :children, :year, :year, index: true 
    end 

    def down 
    remove_column :children, :year 

    execute <<-SQL 
     DROP TYPE year; 
    SQL 
    end 
end 

마지막으로 DB 마이그레이션의 경우 rails db:migrate이 변경됩니다.

이제 레일스 열거 형을 사용하여 DB에 문자열을 저장할 수 있습니다.