8
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

active hash でセレクトボックスをつくる

Last updated at Posted at 2020-04-03

1 active hashとは

某フリマサイトを作成する際に、active hashというgemを使ってセレクトタグを作成しました。
active hashは都道府県などデータベースを作成するほどではなく、かつ変更される可能性が低いデータを扱いたい時に便利なgemです。
ハッシュを使ってアクティブレコードのモデルのように扱えるファイルを作成できます。

<gemのリンク>

https://github.com/zilkey/active_hash

READMEの記述

ActiveHash is a simple base class that allows you to use a ruby hash as a readonly datasource for an ActiveRecord-like model.

2 使い方

1) gemのインストール

まずはgemfileに以下のコードを記述してbundle installします。

gem 'active_hash', '~> 2.3.0'  ←2020/04/03現在のバージョン

###2) モデルの作成
app>modelsの中に直接ファイルを作成します。
注意: rails g model は使わない

今回は都道府県のactive hashを作成するためprefecture.rbという名前でファイルを作成します。

ファイルの中身の書き方は以下の通りです。

class Prefecture < ActiveHash::Base
  self.data = [
    {id: 0, name: '選択してください'},
      {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: '沖縄県'}, {id: 48, name: '未定'}
  ]
end

3) アソシエーションを組む & バリデーションをかける(任意)

a) アソシエーションを組む
active_hashにはbelongs_to_active_hashメソッドが用意されているのでaddressモデルに記述します。
※active hashの方には記述する必要はありません。

b) 保存するデータベースにバリデーションをかける
今回はユーザー登録の際に必ず都道府県を入力させたいので、addressモデルにバリデーションをかけます。

address.rb
extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :prefecture
  belongs_to :user, optional: true
  validates :prefecture, presence: true   ←この記事に関係ないカラムは省略してます

以上です。
簡単ですね。

2 viewにactive hashからデータを持ってくる

active hashを使いたいビューページに以下の記述をします。

= f.collection_select :prefecture_id, Prefecture.all, :id, :name 

<記述内容の解説>
第一引数:登録するデータベースのカラム名
第二引数:作成したactive hashからどのようにデータを持ってくるかを指定
第三引数:paramsで送るデータを指定(:nameでも可能 ※dbのカラムはstringにしましょう。)
第四引数:ユーザーが見れるセレクトタグの内容
※今回はcollection_selectの説明は割愛します。




なお今回は、都道府県を記入させるタイミングが二回あり、二度目の発送元の記入では-未定-を選べるためactive hash内に記述しましたが、ユーザー登録では-未定-は使いたくないためそれ以外を引き出します。

= f.collection_select :prefecture_id, Prefecture.where.not(name: '未定'), :id, :name

3 完成写真

4、注意

formを使うと自動でidが割り振られるので、cssを当てる時は検証ツールを使ってidを確認しましょう。



以上です。最後までご覧いただきありがとうございました。
8
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?