質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.33%

rspecで予約登録のテストを通過させたいです。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 153

score 5

前提・実現したいこと

ブラウザではきちんと登録処理できるのですが、rspecを通過できず詰まっております。
どなたがご教授お願いたします。

発生している問題・エラーメッセージ

require 'rails_helper'

RSpec.describe "ビデオ通話予約機能", type: :request do
  let(:user) { create(:user) }
  let(:other_user) { create(:user) }

  context "予約登録処理" do
    it "予約登録は実行できること" do
      login_for_request(user)
      get reservations_path(user_id: other_user.id, from_user_id: user.id)
      get new_reservation_path(user_id: other_user.id), params:  { day: "2021-07-25",
                                                                   time: "10:00",
                                                                   user_id: other_user.id }
      expect {
        post "/reservations", params: { reservation: { day: "2021-07-25",
                                                       time: "10:00",
                                                       start_time: "2021-07-25T10:00:00+09:00",
                                                       user_id: other_user.id } }
      }.to change(Reservation, :count).by(1)
      follow_redirect!
      expect(response).to render_template('reservations/show')
    end
  end
end

Failures:

  1) ビデオ通話予約機能 予約登録処理 予約登録は実行できること
     Failure/Error: <%= f.hidden_field :user_id, value: @user.id %>

     ActionView::Template::Error:
       undefined method `id' for nil:NilClass
     # ./app/views/reservations/new.html.erb:20:in `block in _app_views_reservations_new_html_erb___1207770112998073758_70130725436680'
     # ./app/views/reservations/new.html.erb:9:in `_app_views_reservations_new_html_erb___1207770112998073758_70130725436680'
     # ./app/controllers/reservations_controller.rb:27:in `create'
     # ./spec/requests/reservations_spec.rb:35:in `block (4 levels) in <main>'
     # ./spec/requests/reservations_spec.rb:34:in `block (3 levels) in <main>'
     # -e:1:in `<main>'
     # ------------------
     # --- Caused by: ---
     # NoMethodError:
     #   undefined method `id' for nil:NilClass
     #   ./app/views/reservations/new.html.erb:20:in `block in _app_views_reservations_new_html_erb___1207770112998073758_70130725436680'

該当のソースコード

app/controllers/reservations_controller.rb

class ReservationsController < ApplicationController
  before_action :logged_in_user

  def index
    @user = User.find(params[:user_id])
    @reservations = Reservation.where("day >= ?", Date.current).where("day < ?", Date.current >> 3).order(day: :desc).where("user_id = ? or from_user_id = ?", @user.id, current_user.id)
  end

  def new
    @user = User.find(params[:user_id])
    @reservation = Reservation.new
    @day = params[:day]
    @time = params[:time]
    @start_time = DateTime.parse(@day + " " + @time + " " + "JST")
  end

  def show
    @reservation = Reservation.find(params[:id])
  end

  def create
    @reservation = Reservation.new(reservation_params)
    if @reservation.save
      flash[:success] = "ビデオ通話予約しました"
      redirect_to reservation_path @reservation.id
    else
      render :new
    end
  end

  def destroy
    @reservation = Reservation.find(params[:id])
    if @reservation.destroy
      flash[:success] = "予約を削除しました。"
      redirect_to user_path(current_user.id)
    else
      render :reserve
    end
  end

  private
  def reservation_params
    params.require(:reservation).permit(:day, :time, :user_id, :from_user_id, :start_time)
  end
end


app/views/reservations/new.html.erb

<% provide(:title, "新規予約画面") %>
<section id="contact" class="contact section-bg login">
  <div class="container">
    <div class="col-12 text-center title">
      <h2>新規予約画面</h2>
    </div>
    <div class="row justify-content-md-center">
      <div class="col-md-5 col-md-offset-3">
        <%= form_with model: @reservation, local: true, class: 'form' do |f| %>
        <%= render 'shared/error_messages', object: f.object %>
        <div class="day form-group">
          <%= f.label :day, '日付' %>
          <%= f.text_field :day, class: 'form-control', value: @day, readonly: true %>
        </div>
        <div class="time form-group">
          <%= f.label :time, '時間' %>
          <%= f.text_field :time, class: 'form-control', value: @time, readonly: true %>
        </div>
        <%= f.hidden_field :from_user_id, value: current_user.id %>
        <%= f.hidden_field :user_id, value: @user.id %>
        <%= f.hidden_field :start_time, value: @start_time %>
        <div class="submit">
          <%= f.submit nil, class: 'btn btn-primary' %>
        </div>
        <% end %>
      </div>
    </div>
  </div>
</section>

サーバーログ

Started GET "/reservations?user_id=1" for ::1 at 2021-07-24 11:00:07 +0900
Processing by ReservationsController#index as HTML
  Parameters: {"user_id"=>"1"}
  User Load (0.9ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/helpers/sessions_helper.rb:43
  User Load (0.8ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/reservations_controller.rb:5
  Rendering reservations/index.html.erb within layouts/application
  Reservation Load (53.0ms)  SELECT "reservations".* FROM "reservations" WHERE (day >= '2021-07-24') AND (day < '2021-10-24') AND (user_id = 1 or from_user_id = 1) ORDER BY "reservations"."day" DESC
  ↳ app/views/reservations/index.html.erb:11
  Reservation Load (0.8ms)  SELECT "reservations".* FROM "reservations" WHERE (day >= '2021-07-24') AND (day < '2021-08-24') ORDER BY "reservations"."day" DESC
  ↳ app/models/reservation.rb:15
  Rendered simple_calendar/_week_calendar.html.erb (15.1ms)
  Rendered reservations/index.html.erb within layouts/application (89.1ms)
  Rendered layouts/_rails_default.html.erb (24.8ms)
  Rendered layouts/_shim.html.erb (0.5ms)
  Rendered layouts/_navigation.html.erb (3.4ms)
  Rendered layouts/_search.html.erb (4.4ms)
  Rendered layouts/_footer.html.erb (0.5ms)
  Rendered layouts/_js.html.erb (16.7ms)
Completed 200 OK in 188ms (Views: 107.2ms | ActiveRecord: 55.5ms)


Started GET "/reservations/new?day=2021-07-25&time=10%3A00&user_id=1" for ::1 at 2021-07-24 11:00:08 +0900
Processing by ReservationsController#new as HTML
  Parameters: {"day"=>"2021-07-25", "time"=>"10:00", "user_id"=>"1"}
  User Load (3.9ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/helpers/sessions_helper.rb:43
  User Load (0.8ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/reservations_controller.rb:10
  Rendering reservations/new.html.erb within layouts/application
  Rendered shared/_error_messages.html.erb (0.9ms)
  Rendered reservations/new.html.erb within layouts/application (93.1ms)
  Rendered layouts/_rails_default.html.erb (21.5ms)
  Rendered layouts/_shim.html.erb (0.4ms)
  Rendered layouts/_navigation.html.erb (2.3ms)
  Rendered layouts/_search.html.erb (1.0ms)
  Rendered layouts/_footer.html.erb (0.3ms)
  Rendered layouts/_js.html.erb (7.1ms)
Completed 200 OK in 147ms (Views: 135.9ms | ActiveRecord: 4.6ms)


Started POST "/reservations" for ::1 at 2021-07-24 11:00:11 +0900
Processing by ReservationsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"uzBu1Xyew30viLVC/AypLZ/h0zfOq9VxzEUyOloFyV8niK9bO8hOX6HmF6Y+UhAX/dul3TDfqlkpIgPgEkzxcA==", "reservation"=>{"day"=>"2021-07-25", "time"=>"10:00", "from_user_id"=>"1", "user_id"=>"1", "start_time"=>"2021-07-25T10:00:00+09:00"}, "commit"=>"登録する"}
  User Load (1.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/helpers/sessions_helper.rb:43
   (0.2ms)  BEGIN
  ↳ app/controllers/reservations_controller.rb:23
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/reservations_controller.rb:23
  Reservation Exists (7.6ms)  SELECT  1 AS one FROM "reservations" WHERE "reservations"."start_time" = $1 LIMIT $2  [["start_time", "2021-07-25 01:00:00"], ["LIMIT", 1]]
  ↳ app/controllers/reservations_controller.rb:23
  Reservation Create (15.5ms)  INSERT INTO "reservations" ("day", "time", "user_id", "created_at", "updated_at", "start_time", "from_user_id") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["day", "2021-07-25"], ["time", "10:00"], ["user_id", 1], ["created_at", "2021-07-24 02:00:11.467966"], ["updated_at", "2021-07-24 02:00:11.467966"], ["start_time", "2021-07-25 01:00:00"], ["from_user_id", 1]]
  ↳ app/controllers/reservations_controller.rb:23
   (47.0ms)  COMMIT
  ↳ app/controllers/reservations_controller.rb:23
Redirected to http://localhost:3000/reservations/20
Completed 302 Found in 125ms (ActiveRecord: 71.9ms)


Started GET "/reservations/20" for ::1 at 2021-07-24 11:00:11 +0900
Processing by ReservationsController#show as HTML
  Parameters: {"id"=>"20"}
  User Load (0.6ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/helpers/sessions_helper.rb:43
  Reservation Load (0.5ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."id" = $1 LIMIT $2  [["id", 20], ["LIMIT", 1]]
  ↳ app/controllers/reservations_controller.rb:18
  Rendering reservations/show.html.erb within layouts/application
  Rendered reservations/show.html.erb within layouts/application (1.1ms)
  Rendered layouts/_rails_default.html.erb (8.4ms)
  Rendered layouts/_shim.html.erb (0.3ms)
  Rendered layouts/_navigation.html.erb (3.1ms)
  Rendered layouts/_search.html.erb (1.8ms)
  Rendered layouts/_footer.html.erb (0.3ms)
  Rendered layouts/_js.html.erb (7.2ms)
Completed 200 OK in 37ms (Views: 30.7ms | ActiveRecord: 1.2ms)

補足情報(FW/ツールのバージョンなど)

rubyのバージョンは2.6.7です。
必要な箇所があれば載せますのでよろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

model のcodeが載っていないのでエスパーモードですが
おそらく validation に掛かって create のsaveに失敗し、render :new に行ったのだが、この場合は @user 定義してないですね。
そのためのエラーです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/07/24 12:07

    ご回答ありがとうございます。
    rspecのコードで引っ掛かっていたのですね。

    キャンセル

0

エラーメッセージ通りHTMLの
<%= f.hidden_field :user_id, value: @user.id %>
@user がNilになっているのが原因ではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/07/24 11:06

    ご回答ありがとうございます。 また言葉が足らず申し訳ございません。
    @user が nil だとわかるのですが、ブラウザは正常に作動しているので
    rspecを修正しなければならないと思うのですが、どうすればよいでしょうか。
    サーバログも追記します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る