🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Q&A

1回答

1775閲覧

RSpecでの ActiveRecord::RecordNotFound:の解決

ryoooos

総合スコア11

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

0グッド

0クリップ

投稿2019/12/28 11:19

タスク管理アプリを作成しており、userモデルとtaskモデルを作成しています。
RSpecで、Controller-specを書いています。
pachリクエストを送るspecの部分で、エラーが出ます。

エラーは以下の通りです。

Failure/Error: task = current_user.tasks.find(params[:id]) ActiveRecord::RecordNotFound: Couldn't find Task with 'id'=1 [WHERE "tasks"."user_id" = ?] # ./app/controllers/tasks_controller.rb:30:in `update' # ./spec/controllers/tasks_controller_spec.rb:107:in `block (4 levels) in <top (required)>' # -e:1:in `<main>'

task_controller_spec.rbファイルは以下です。
user_id= ?となっていますが、以下の@task= ...のFactoryBot部分のように、userモデルとtaskモデルは関連させています。
エラーの内容から、関連が上手くいっていないのかなと思っていますが、どのようにすれば解決できるでしょうか。
よろしくお願いいたします。

rb:spec.task_controller_spec.rb

1require 'rails_helper' 2include SessionsHelper 3 4RSpec.describe TasksController, type: :controller do 5 6 describe "PATCH #update" do 7 8 context "認可されていないユーザーとして" do 9 before do 10 @user_a = FactoryBot.create(:user) 11 @user_b = FactoryBot.create(:user) 12 @task = FactoryBot.create(:task, user: @user_b, name: "タスク") 13 end 14 15 it "タスクが更新できない" do 16 task_params = FactoryBot.attributes_for(:task, name: "新しいタスク") 17 log_in @user_a 18 patch :update, params: { id: @task.id, task: task_params} 19 expect(@task.reload.name).to eq "タスク" 20 end 21 22 end 23 end 24 end 25

controller.rbは以下です。

class TasksController < ApplicationController before_action :login_required def index @tasks = current_user.tasks.order(created_at: :desc) end def show @task = current_user.tasks.find(params[:id]) end def new @task = Task.new end def create @task = current_user.tasks.new(task_params) if @task.save redirect_to @task, notice: "タスク #{@task.name} を登録しました" else render :new end end def edit @task = current_user.tasks.find(params[:id]) end def update task = current_user.tasks.find(params[:id]) task.update!(task_params) redirect_to tasks_url, notice: "タスク #{task.name} を更新しました" end def destroy task = current_user.tasks.find(params[:id]) task.destroy redirect_to tasks_url, notice: "タスク #{task.name} を削除しました" end private def task_params params.require(:task).permit(:name, :description) end def login_required redirect_to login_path unless current_user end end

FactoryBotのtaskは以下です。

FactoryBot.define do factory :task do sequence(:name) {|n| "タスク#{n}"} description { "RSpec & Capybara & FactoryBotを準備する"} association :user end end

FactoryBotのuserは以下です。

FactoryBot.define do factory :user, aliases: [:owner] do name { "テストユーザー"} sequence(:email) {|n| "test#{n}@example.com"} password { "password"} end end

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

どのようにすれば解決できるでしょうか。

一旦データベースに保存させるのがいいかと思います。実際にデータベースから引いてくるという動作が入る以上、リレーションなどもデータベース保存してあるのが前提となります。

投稿2019/12/28 22:10

maisumakun

総合スコア145963

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryoooos

2019/12/28 23:29

回答ありがとうございます。 データベースに保存とのことですが、association :userとすることで、「関連」が出来ていると認識していました。associationではデータベースにまでは保存されていないということですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問