LoginSignup
0

posted at

updated at

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

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生成時に"---"が選択されることがなくなり問題が解決しました。

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
What you can do with signing up
0