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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 6

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

RSpec

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

Q&A

解決済

2回答

1209閲覧

RspecのRequest testで、find_by(...)の結果ActiveRecord::RecordNotFound: Couldn't find Articleとなってしまう

naokit-dev

総合スコア424

Ruby on Rails 6

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

RSpec

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

0グッド

0クリップ

投稿2020/07/29 11:49

編集2020/07/29 15:19

問題点

RSpecでRequestテストを書いております

以下のようにupdateアクションのテストを行う際に、

"Failure/Error: @article = Article.find_by!(url_token: params[:url_token])
ActiveRecord::RecordNotFound:
Couldn't find Article"

とエラーがでており、解消できません。

spec/requests/articles_spec.rb

require 'rails_helper' RSpec.describe "Articles", type: :request do describe "PATCH #update" do let!(:user) { FactoryBot.create(:user) } let!(:article) { user.articles.create(FactoryBot.attributes_for(:article, title: "test #edit"))} context "パラメーターが妥当な場合" do it "リクエストが成功すること" do patch articles_path, params: { url_token: article.url_token } expect(response).to have_http_status(302) end end end end end

検証

it以下に下記コードを差し込むと

p Article.last p article.url_token #<Article id: 810, title: "test #edit", content: "Hello World", created_at: "2020-07-29 11:20:25", updated_at: "2020-07-29 11:20:25", user_id: 1109, url_token: "UgBg0MJb_sA", article_token_digest: "$2a$04$GPFQLbz1Uvb/vqpV2rXs/uy/VMdyGGUUpiXObE3zjeq..."> "UgBg0MJb_sA"

と返ってきており、DB上にデータは存在し、
paramsに渡す変数article.url_tokenも適切のように思います。

paramsの与え方に問題があるのでしょうか?

development環境のコンソール上だと問題なくfind_byで該当記事を抽出できます・

気になる点

url_token属性はbefore_validationでvalidationが行われる前に生成されるよう、modelにて定義しております。
この辺り問題になりますでしょうか?

app/models/article.rb

ruby

1class Article < ApplicationRecord 2 belongs_to :user 3 has_secure_password :article_token, validations: true 4 attribute :url_token, :string, default: -> { SecureRandom.urlsafe_base64(8) } 5 before_validation :create_article_token 6 validates :title, presence: true, length: { maximum: 100 } 7 validates :content, presence: true 8 9 def to_param 10 url_token 11 end 12 13 private 14 def create_article_token 15 self.article_token = SecureRandom.hex(4) 16 end 17end

articles_controller.rb

class ArticlesController < ApplicationController before_action :set_article, only: [:show, :edit, :update, :destroy] . . . def update respond_to do |format| if @article.update(article_params) format.html { redirect_to @article, notice: 'Article was successfully updated.' } format.json { render :show, status: :ok, location: @article } else format.html { render :edit } format.json { render json: @article.errors, status: :unprocessable_entity } end end end . . . private # Use callbacks to share common setup or constraints between actions. def set_article @article = Article.find_by!(url_token: params[:url_token]) @author = @article.user end # Only allow a list of trusted parameters through. def article_params params.require(:article).permit(:title, :content, :url_token, :article_token) end end

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

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

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

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

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

guest

回答2

0

ベストアンサー

はい、paramsに問題があります。
update で使う id も article_params に顔を出している項目もわたっていません。

投稿2020/07/29 12:34

winterboum

総合スコア23567

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

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

naokit-dev

2020/07/29 15:11

問題箇所を絞ることができました、ありがとうございました。 冷静に確認したところ解決できました。
guest

0

解決

  • articles_path -> article_path
  • article_path(article)で引数を渡していない
  • 新しいパラメーターを渡しておらずテストとして不足

冷静に考えると問題だらけでお恥ずかしい、
なにかの役に立つことを願って解決をのこしておきます。

回答者様ありがとうございました。

describe "PUT #update" do let!(:user) { FactoryBot.create(:user) } let!(:article) { user.articles.create(FactoryBot.attributes_for(:article))} context "パラメーターが妥当な場合" do let(:valid_params) { FactoryBot.attributes_for(:article, title: "new title", content: "new contetn") } it "リクエストが成功すること" do put article_path(article), params: { article: valid_params } expect(response).to have_http_status(302) end end end

投稿2020/07/29 15:19

naokit-dev

総合スコア424

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問