##ActiveHashを実装する目的
特に入力せず、選択方式で保存したいデータに対し、ActiveHashを導入しようと考えた。それにより、UIの向上を目指す。
##手順①Gemの導入
gem 'active_hash'
上記をGemfile
に記述し、ターミナル上でbundle install
を実行する。
##手順②モデルを作成する
class Term < ActiveHash::Base
self.data = [
{ id: 1, name: '学期を選択' },
{ id: 2, name: '1学期' },
{ id: 3, name: '2学期' },
{ id: 4, name: '3学期' },
{ id: 5, name: '前期中間'},
{ id: 6, name: '前期期末'},
{ id: 7, name: '後期中間'},
{ id: 8, name: '後期期末'},
]
include ActiveHash::Associations
has_many :scores
end
モデルはmodelディレクトリ内に、マグレーションファイルが不要なため、手動で作成する。ActiveHashではIdで保存されるため、それぞれに紐づく情報をname: '情報'
という形で記述する。また、ScoreモデルにもActiveHashを有効にするため下記のように記述をする。
belongs_to_active_hash :term
##手順③カラムを設定する
ActiveHashのデータを保存するテーブルにActiveHashを保存するためにカラムを設定する。
class CreateScores < ActiveRecord::Migration[6.0]
def change
create_table :scores do |t|
t.integer :term_id, null: false #<=idで設定している
t.integer :grade_id, null: false #<=これもActiveHash
t.integer :user_id, null: false
#省略#
t.timestamps
end
end
end
##手順④コントローラーを記述
def score_params
params.require(:score).permit(:grade_id, :term_id, ...省略).merge(user_id: current_user.id)
end
ストロングパラメーターを設定し、ActiveHashのIdを受け付けられるように設定する。
##手順⑤ビューを設定
<div>学期
<%= f.collection_select(:term_id, Term.all, :id, :name, {}) %>
</div>
collection_selectを使用することでプルダウンメニューのように表示することが可能。
##エラーへの対応:ActiveRecord::NotNullViolation in ScoresController#create Mysql2::Error: Field 'term_id' doesn't have a default value
上記のエラーは"term_idがnullになっているためエラーが出ています"というような内容。つまり、term_idが受け取れていない、もしくは遅れていないことが原因。今回はモデルのhas_manyの記述に誤りがあった
has_many :score <=単数系は誤り
has_many :scores <=複数形に訂正
##unknown attribute 'user_id' for Score.
"Scoreモデルにuser_idが保存できません"というような内容。カラムを修正。
class CreateScores < ActiveRecord::Migration[6.0]
def change
create_table :scores do |t|
t.integer :term_id, null: false
t.integer :grade_id, null: false
t.integer :user_id, null: false #<=追記
t.integer :japanese, default: "0"
t.integer :mathematics, default: "0"
t.integer :english, default: "0"
t.integer :social_studies, default: "0"
t.integer :science, default: "0"
t.timestamps
end
end
end
##その他エラー
スペルミスによるものが多いと考えられる。他にも、ビューファイルの絡む指定にスペルミスがあるなど、チェックすべき点は多い。
##まとめ
ActiveHashはコスパいいな!簡単に実装できる割に機能的だと思った。選択方式で保存したい内容についてはどんどん使ってみようと思う。
さいごに
プログラミングの初学者です。その日に学んだことを学習の一環としてアウトプットしています。より深く学習していきたいと考えておりますので、内容に誤りがございまいたらご指摘等いただけますと幸いです。
参考図書:パーフェクト Ruby on Rails【増補改訂版】すがわらまさのり/前島真一/橋立友宏/後藤優一/五十嵐邦明