LoginSignup
0
1

More than 1 year has passed since last update.

ActiveHashにて値のない選択肢を追加する

Last updated at Posted at 2022-06-07

FakerBotを使ってActiveHashを含んだテストコードを作成しようとした際、問題が発生してしまったので、その問題と解決法を書いていきます。

問題点:FactoryBotがバリデーションにかかるidを選択してしまい、テストに失敗する

class Prefecture < ActiveHash::Base
  self.data = [
    { id: 1, name: '---' },
    { id: 2, name: '北海道' },
    { id: 3, name: '青森県' },
class Item < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  validates :prefecture_id, numericality: { other_than: 1 }

選択肢の'---'に該当するprefecture_id: 1を選択すると、バリデーションにかかるように設定してあります。

FactoryBot.define do
  factory :item do
    prefecture { Prefecture.all.sample }

しかし上記のprefecture { Prefecture.all.sample }では、FactoryBotを生成時にバリデーションに設定したprefecture_id: 1も選択されてしまい、テストが失敗することがあるので、それを阻止したいところです。

解決策:collection_selectのオプションに値のない選択肢を追加する

<%= f.collection_select(:prefecture_id, Prefecture.all, :id, :name, {include_blank: "---"}, {class:"select-box", id:"item-prefecture"}) %>

collection_selectの第5引数にinclude_blank: "---"を記述します。
このinclude_blankオプションを使うことにより、値のない選択肢を追加することができました。
これによりバリデーションに設定していた選択肢"---"は値を持たなくなったため、FactoryBot生成時に"---"が選択されることがなくなり問題が解決しました。

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