【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"]
これだけだなのですが、環境周りとかも紹介させてもらえればと思います。
環境/使い方紹介
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: '女性'