おぴよの気まぐれ日記

おぴよの気まぐれ日記

岡山やプログラミング、ファッションのこと、子育てや人生、生き方についての備忘録。

【Rails】enumerizeで定義したフォームのセレクトタグをアクション別に変える

今日やりたかったのは、新規作成時と編集時で同一カラムなんだけどセレクトタグに表示する内容を変えたいってのがあった。

編集の場合は色々な条件があって変更されると困るってのがあったので、悩んでたんだけど結構簡単に出来たのでその方法を紹介します。

新規作成時のview

# new.haml
%h1 キャラクターの登録

= simple_form_for(@character, url: characters_path) do |f|
  = f.input :name
  = f.input :sex

セレクトタグの表示内容画像
セレクトタグの表示内容画像

編集時のview

第二引数にあたる、collectionsにセレクトタグに表示する内容を設定することができます。

# edit.haml
%h1 キャラクターの登録

= simple_form_for(@character, url: characters_path) do |f|
  = f.input :name
  = f.input :sex, collections: Character.sex.values.delete_if {|v| v == 'male'}

コンソールで実行するとこんな感じで、条件に応じて合致したものを削除してくれるってのがdelete_ifになります。

Character.sex.values => ["male", "female"]

Character.sex.values.delete_if {|v| v == 'male'} => ["female"]

delete_ifで削除したセレクトタグの画像
delete_ifで削除したセレクトタグの画像

これだけだなのですが、環境周りとかも紹介させてもらえればと思います。

環境/使い方紹介

Gemfileの設定

先ずはenumが使えるように、gem enumrizeを設定します。

# Gemfile
gem 'enumerize'

modelの設定

次は対象のカラムに対してenumerizeの設定をします。

# character.rb
class Character < ApplicationRecord
  extend Enumerize

  enumerize :sex, in: [:male, :female]
  
  validates :name, presence: true
  validates :sex, presence: true
end

viewの設定

formの生成はsimple_formを使います。こちらの使い方はまた別の機会に。 enumを設定をしたのが:sexですが、この記述だけで勝手にセレクトタグを生成してくれます!クソ楽チン。

# new.haml
%h1 キャラクターの登録

= simple_form_for(@character, url: characters_path) do |f|
  = f.input :name
  = f.input :sex

日本語化の対応

ymlにenumerizeを定義してあげて、対象モデル名とカラム名に対して日本語を設定してやれば表示上は日本語で、データ保存時は英語でってのが簡単に実現できる

# ja.yml
ja:
  enumerize:
    character:
      sex:
        male: '男性'
        female: '女性'