【Rails】enum 컬럼용 select Form Helper 구현

10518 단어 RailsActiveRecord
모델에서 열거 형 열을 form select로 다루기 쉽도록 Form Helper를 구현했습니다.

추가



gem으로 만들었습니다 ⇢ enum_select_rails

전제


  • Rails 5.0.3
  • Ruby 2.4.0

  • 사용자 작성


    $ bundle exec rails g scaffold User name:string gender:integer
    

    gender 열은 enum을 적용하여 정수 값을 저장합니다.

    초기 상태의 양식은 아래 그림과 같습니다.



    enum 정의



    app/models/user.rb
    class User < ApplicationRecord
      enum gender: {
          female: 0,
          male: 1,
          unanswered: 2
      }
    end
    

    enum에 맞게 양식 변경



    모델에 enum을 정의하면 다음과 같이 enum 목록을 얻을 수 있습니다.number_field 대신 select로 변경하십시오.

    app/views/users/_form.html.erb
    <!-- 初期状態 -->
    <div class="field">
      <%= f.label :gender %>
      <%= f.number_field :gender %>
    </div>
    
    <!-- 下記に変更 -->
    <div class="field">
      <%= f.label :gender %>
      <%= f.select :gender, User.genders.keys.map {|k| [k, k]} %>
    </div>
    



    i18n 대응



    enum_help 설치



    이 gem을 사용하여 i18n의 일본어 문자열을 다루기 쉽습니다.

    Gemfile
    gem 'enum_help'
    

    설정 추가



    application.rb를 업데이트하여 자체 제작 된 로케일을 읽습니다.

    config/application.rb
    # i18n
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
    config.i18n.default_locale = :ja
    config.i18n.available_locales = [:ja, :en]
    

    locale 작성



    locale 파일을 만듭니다.User.genders_i18n와 같이 접미사에 _i18n를 붙이면 다음과 같이 정의 된 값을 얻을 수 있습니다.

    config/locales/models/user/en.yml
    ja:
      activerecord:
        models:
          user: ユーザー
        attributes:
          user:
            name: 氏名
            gender: 性別
      enums:
        user:
          gender:
            female: 女性
            male: 男性
            unanswered: 未回答
    

    양식 업데이트



    app/views/users/_form.html.erb
    <!-- 下記に変更 -->
    <div class="field">
      <%= f.label :gender %>
      <%= f.select :gender, User.genders_i18n.keys.map {|k| [User.genders_i18n[k], k]} %>
    </div>
    

    이렇게 Select를 일본어화할 수 있다.



    Form Helper 확장



    매번 쓰는 것은 중복이므로 공통화됩니다.

    config/initializer/extensions/form_helper_extension.rb
    class ActionView::Helpers::FormBuilder
      def enum_select(record, options = {}, html_options = {})
        pluralized = record.to_s.pluralize
        klass = self.object.class
        base = klass.send(pluralized)
        i18n = klass.send("#{pluralized}_i18n")
        select record.to_sym, base.keys.map { |k| [i18n[k], k] }, options, html_options
      end
    end
    
    enum_select 적용.

    app/views/users/_form.html.erb
    <div class="field">
      <%= f.label :gender %>
      <%= f.enum_select :gender %>
    </div>
    

    젬/샘플


  • enum_select_rails
  • GitHub - rails-enum-select-sample
  • 좋은 웹페이지 즐겨찾기