LoginSignup
0
0

More than 3 years have passed since last update.

初学者のプログラミング ActiveHashの実装

Posted at

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【増補改訂版】すがわらまさのり/前島真一/橋立友宏/後藤優一/五十嵐邦明

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