昨晩やったとこさ
アクティブハッシュの導入がうまく言ったので
覚書でーす
というか
一次ソースからmigrationの記述を見つけられず焦った、、、
環境
ruby 2.5
rails 5.2.4.3
devise 4.7.2
active_hash 3.1.0
参考
zilkey/active_hash:
collection_select
ちょっとしたデータの格納に使います。
都道府県のデータ選択など一つのアプリで何箇所か使いたい、
でもDB使うまででもない。
うーん、、、
ってときにおすすめです。
カテゴリでも使えるのかな??
↑カテゴリーはancestryというgemでした。
https://github.com/stefankroes/ancestry
簡単導入
gemに
gem 'active_hash'
いつもの
bundle install
model追加 ここまでは簡単だったOTZ
☓ rails g model モデル名 ←しません。
今回は都道府県のデータなので
class Prefecture < ActiveHash::Base
self.data = [
{id: 1, name: '北海道'}, {id: 2, name: '青森県'}, {id: 3, name: '岩手県'},
{id: 4, name: '宮城県'}, {id: 5, name: '秋田県'}, {id: 6, name: '山形県'},
{id: 7, name: '福島県'}, {id: 8, name: '茨城県'}, {id: 9, name: '栃木県'},
{id: 10, name: '群馬県'}, {id: 11, name: '埼玉県'}, {id: 12, name: '千葉県'},
{id: 13, name: '東京都'}, {id: 14, name: '神奈川県'}, {id: 15, name: '新潟県'},
{id: 16, name: '富山県'}, {id: 17, name: '石川県'}, {id: 18, name: '福井県'},
{id: 19, name: '山梨県'}, {id: 20, name: '長野県'}, {id: 21, name: '岐阜県'},
{id: 22, name: '静岡県'}, {id: 23, name: '愛知県'}, {id: 24, name: '三重県'},
{id: 25, name: '滋賀県'}, {id: 26, name: '京都府'}, {id: 27, name: '大阪府'},
{id: 28, name: '兵庫県'}, {id: 29, name: '奈良県'}, {id: 30, name: '和歌山県'},
{id: 31, name: '鳥取県'}, {id: 32, name: '島根県'}, {id: 33, name: '岡山県'},
{id: 34, name: '広島県'}, {id: 35, name: '山口県'}, {id: 36, name: '徳島県'},
{id: 37, name: '香川県'}, {id: 38, name: '愛媛県'}, {id: 39, name: '高知県'},
{id: 40, name: '福岡県'}, {id: 41, name: '佐賀県'}, {id: 42, name: '長崎県'},
{id: 43, name: '熊本県'}, {id: 44, name: '大分県'}, {id: 45, name: '宮崎県'},
{id: 46, name: '鹿児島県'}, {id: 47, name: '沖縄県'}
]
end
※ポイント 先頭はデータにしといたが吉 「選択してください」とかはあんませんほうがよい。気がする。class使いたいから。
model 追記 一次ソースの基本の通り
今回は address model
association address 多 ←→ 1 prefecture
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :prefecture
migrationを変更 このあたりから情報が、、、
該当のmigrationFileを編集
今回は
t.integer :prefecture_id, null: false, default: nil
null〜はお好みで♪
書き換えたら、いつもの rails db:migrate ね
strong params も書き換えてね^^
多分registrations_controller.rb
の:prefectureの部分だけです。
:prefecture_idにしました。
protected
def address_params
params.require(:address).permit(
:family_name_kanji,
:first_name_kanji,
:family_name_kana,
:first_name_kana,
:post_number,
:prefecture_id,
:city,
:block_number,
:apartment_name,
:phone_number,
)
end
view 変更
classがやっかいでした。
= f.collection_select :prefecture_id,Prefecture.all,:id,:name,{prompt:"--"},{class:"inputDefault"}
これでこう↓なります。
<select class="inputDefault" name="address[prefecture_id]" id="address_prefecture_id"><option value="">--</option>
<option value="">--</option>
<option value="1">北海道</option>
<option value="2">青森県</option>
<option value="3">岩手県</option>
・・・・・
<option value="47">福岡県</option></select>
※ポイント 先頭データ↓がないとclass読み込みません!
= f.collection_select :カラム名,登録するデータ,表示するデータ,先頭データ(selectedもここ),今回はclass
多分以上で終了です。
migrationのカラムをt.string :prefecture から上記に変更する発想がなく、一生懸命、collection_select の登録データを:nameにする努力をしてた^^;
あっという間の数時間TT