1
0

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.

ActiveHashの活用

Posted at

#はじめに
Railsでオリジナルアプリを制作しています。このアプリにActiveHashを適用しました。プルダウン形式でActiveHashで設定したデータを選択できるようにしました。忘れても思い出せるよう書き残します。

※ActiveHashは都道府県名一覧のように変更されないデータを扱います。変更されないデータなので、データベースには直接保存する必要がないです(都道府県毎に用意したidは保存されます)。

開発環境
ruby 2.6.5
Rails 6.0.3.4

#目次
1.ActiveHashの導入
2.モデルの準備
3.コントローラーの準備
4.ビューの表示

#1.ActiveHashの導入
ActiveHashはGemの1つ。Gemファイルに追記し、ターミナルでインストールする。

Gemfile
gem 'active_hash'
ターミナル
bundle install

#2.モデルの準備
ここではday(日数)をActiveHashの対象とする。モデル作成時--skip-migrationを追加するとマイグレーションファイルは作成されない。他にもActiveHashの対象があるなら、その数だけモデルを作成する。

ターミナル
rails g model day --skip-migration

モデル内ではActiveHashを継承するすること。self.dataはハッシュ形式のデータが格納された配列になる。ハッシュ内はidとname(日数)が紐づく。

app/models/day.rb
class day < ActiveHash::Base #←ActiveHashを継承する
 self.data = [
   { id: 1, name: '--' },
   { id: 2, name: '1日' },
   { id: 3, name: '1週間' },
 ]
 end

続いて上記で設定した日数のidをデータベースに保存する設定を行う。ActiveHashが紐づくテーブルとしてarticleを例にする。

2020***********_create_articles.rb
class CreateArticles < ActiveRecord::Migration[6.0]
 def change
   create_table :articles do |t|
     t.string     :title        , null: false
     t.text       :text         , null: false
     t.integer    :day_id       , null: false #ActiveHashのidが保存されるカラム 
     t.timestamps
   end
 end
end

忘れずマイグレーションを行う。モデルのアソシエーションも。

app/model/article
validates :day_id # _idをつける
belongs_to_active_hash :day # _idは不要

#3.コントローラーの準備
ストロングパラメータにday_idを追加して、保存できるようにする。

article.controller.rb
:
  def new    
    @article = Article.new
  end

  def create    
    @article = Article.new(article_params)
  end

  private
  def article_params
    params.require(:article).permit(:title, :text, :day_id)
  end

#ビューの表示
collection_selectによってプルダウン形式で表示できる。引数は第一から第五まである。

| 引数 | 値 |
|:-:|:-:|:-:|
| 第一引数(保存されるカラム ) | day_id |
| 第二引数(オブジェクトの配列) | Day.all |
| 第三引数(カラムに保存される項目) | id |
| 第四引数(選択肢に表示されるカラム名) | name |
| 第五引数(オプション) | {} |
| htmlオプション | {class:"day-select"} |

<%= f.collection_select(:day_id, Day.all, :id, :name, {}, {class:"day-select"}) %>

以上

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?