denisov_2023
@denisov_2023 (デニソフ)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ActiveHashを用いた際のsystemspecのエラー

Q&A

Closed

□解決したいこと

投稿画面(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' 

部分の適切な記述方法とうございましたらご教示いただけないでしょうか。

ご協力いただきたくお願い申し上げます。

0

1Answer

select '法規・条例', from: 'tip_category_id' 

部分を

select Category.data[@tip.category_id][:name], from: 'tip_category_id'

とすることで解決しました。
ご迷惑をおかけしました。

0Like

Your answer might help someone💌