ActiveHashを用いた際のsystemspecのエラー
□解決したいこと
投稿画面(app/views/tips/new.html.erb)にてsystemspecを行なった際、投稿に成功するとindex.html.erbに移動する段階で以下のエラーが発生しました。
当該エラーを解決したいのですが、ご協力いただけないでしょうか。
以下、エラー本文
Failure/Error: <p class="tiped-title-contents">カテゴリー : <%= Category.data[f.category_id][:name] %></p>
ActionView::Template::Error:
undefined method `[]' for nil:NilClass
[Screenshot]: /Users/taniguroarata/originalapp/archtips/tmp/screenshots/failures_r_spec_example_groups_nested_nested_visit_new_user_session_path_231.png
# ./app/views/tips/_main_area.html.erb:17:in `block in _app_views_tips__main_area_html_erb__1894181271776908624_70358077282820'
# ./app/views/tips/_main_area.html.erb:12:in `_app_views_tips__main_area_html_erb__1894181271776908624_70358077282820'
# ./app/views/tips/index.html.erb:10:in `_app_views_tips_index_html_erb___4391342711310590138_70357992921920'
# ------------------
# --- Caused by: ---
# NoMethodError:
# undefined method `[]' for nil:NilClass
# ./app/views/tips/_main_area.html.erb:17:in `block in _app_views_tips__main_area_html_erb__1894181271776908624_70358077282820'
spec/system/tips_spec.rb
require 'rails_helper'
RSpec.describe "投稿する", type: :system do
before do
@tip = FactoryBot.create(:tip)
@user = FactoryBot.create(:user)
end
context '投稿に成功した時' do
it 'visit new_user_session_path' do
visit new_user_session_path
fill_in 'user_email', with: @user.email
fill_in 'user_password', with: @user.password
find('input[type="submit"]').click
expect(current_path).to eq(root_path)
expect(page).to have_content('新規投稿')
visit new_tip_path
fill_in 'tip_title', with: @tip.title
select '法規・条例', from: 'tip_category_id' #ここが問題と思われます
fill_in 'tip_description', with: @tip.description
binding.pry
expect{
find('input[type="submit"]').click
}.to change {Tip.count }.by(1)
expect(current_path).to eq(root_path)
end
end
end
app/views/tips/new.html.erb (テスト時の画面)
※画像の投稿は必須ではないため、今回は飛ばしてテストしております
<div class = "wrapper">
<%= render "shared/header" %>
<div class="main-tips-new">
<div class = "new-tip-string">
<p>新規投稿</p>
</div>
<%= form_with(model: @tip, local: true) do |form| %>
<%= render 'layouts/error_messages', model: form.object, class:"" %>
<div class="tip-title">
<p>タイトル</p>
<div class="tip-title-content">
<%= form.text_field :title, placeholder: "" %>
</div>
</div>
<div class="tip-category">
<p>カテゴリー</p>
<div class="tip-category-content">
<%= form.collection_select(:category_id, Category.all, :id, :name, {}, {class:""}) %>
</div>
</div>
<div class="tip-images">
<div class="tip-image-main">
<p class="tip-image-main-text">画像(メイン)</p>
<div id="image-list">
<%= form.file_field :image, class: 'tip-image-main-img' %>
</div>
</div>
<div class="tip-image-sub">
<p class="tip-image-sub-text">画像(サブ)</p>
<div class="tip-image-sub-images">
<%= form.file_field :image, class: 'tip-image-sub-img' %>
<%= form.file_field :image, class: 'tip-image-sub-img' %>
<%= form.file_field :image, class: 'tip-image-sub-img' %>
</div>
</div>
</div>
<div class="tip-description">
<p class="tip-description-text">説明</p>
<%= form.text_field :description, placeholder:"", class: 'text-form' %>
</div>
<%= form.submit "投稿する" %>
<% end %>
</div>
</div>
app/views/tips/_main_area.html.erb
<div class="main-top">
<div class="new-tip-title">
<p>最新の投稿</p>
</div>
<div class="search-area">
<div>
<input class="search-form"placeholder= " キーワードを入力">
</div>
<input value="検索" class="search-button">
</div>
</div>
<% @tips.each do |f| %>
<div class="tiped">
<div class="tiped-description">
<h3 class="tiped-title"><%= f.title %></h3>
<p class="tiped-title-contents">投稿時間 : <%= l f.created_at%></p>
<p class="tiped-title-contents">カテゴリー : <%= Category.data[f.category_id][:name] %></p>
<p class="tiped-title-contents">投稿者 : <%= f.user.nickname%></p>
<p class="tiped-title-contents">説明 : <%= f.description%></p>
</div>
<div class="tiped-image-field">
<div class="main-image", id="main-image">
<%= image_tag f.image, class: 'uped-image-main' if f.image.attached? %>
</div>
</div>
</div>
<% end %>
app/models/category.rb
class Category < ActiveHash::Base
self.data = [
{ id: 1, name: '--' },
{ id: 2, name: '法規・条例' },
{ id: 3, name: '納まり・詳細図' },
{ id: 4, name: '仕上げ' },
]
include ActiveHash::Associations
has_many :categories
end
環境
'rails', '~> 6.0.0'
'capybara', '>= 2.15'
ruby '2.6.5'
□仮説
new.html.erbにてテストを行なっている際、
「カテゴリー」はActiveHashを用いて、選択するしようとなっております。
spec/system/tips_spec.rb では
select '法規・条例', from: 'tip_category_id'
と記述しており、ここが問題と想定しております。
new.html.erbで投稿が成功したら、index.html.erbからrenderした app/views/tips/_main_area.html.erb で投稿内容が表示されます。
その際、カテゴリーはidを引数に表示を行なっております。
spec/system/tips_spec.rb でselect '法規・条例'としていることでidが選択されないため、このようなエラーが発生しているものと考えました。
□仮説を元に実行したこと
systemspecでidを選択する必要があると思い
fill_in 'tip_category_id', with: @tip.category_id
としましたが、当該記述ではカテゴリーが選択されませんでした。
おそらく、記述形式ではないためfill_inは有効ではないということと想定されます。
spec/system/tips_spec.rb
select '法規・条例', from: 'tip_category_id'
部分の適切な記述方法とうございましたらご教示いただけないでしょうか。
ご協力いただきたくお願い申し上げます。