2017-05-13 21 views
-1

私はRSpecがエラーを起こす理由を理解できません。 エラーメッセージは次のとおりです。どのようにActiveRecord :: RecordNotFoundを解決するには?

1) ArticlesController POST #update with valid params assigns the article as @article 
    Failure/Error: @article = Article.find(params[:article][:id]) 

    ActiveRecord::RecordNotFound: 
     Couldn't find Article with 'id'= 
    # ./app/controllers/articles_controller.rb:205:in `update' 
    # ./spec/controllers/articles_controller_spec.rb:121:in `block (4 levels) in <top (required)>' 

RSpecテストのためのデータベースを用意しました。スキーマが形成され、データが空でした。

はここ

def update 
    @article = Article.find(params[:article][:id]) 
    @article.publish_at = params[:article][:publish_at] 
    @article.publish_until = params[:article][:publish_until] 
    @article.update_user_id = params[:article][:update_user_id] 

    @article.article_histories.build 
    @article.article_histories.last.article_id = params[:article][:id] 
    @article.article_histories.last.title = params[:article_histories][:title] 
    @article.article_histories.last.content = params[:article_histories][:content] 
    @article.article_histories.last.version = @article.article_histories.maximum(:version) + 1 
    @article.current_version = @article.article_histories.last.version 

    @article.status = Article.statuses[:ready] unless @article.scrape? 
    @article.thumbnail = article_params[:file] 

マイRSpecのテストはこのようなものです私の記事のコントローラーです。

describe 'POST #update' do 
    context 'with valid params' do 
     let(:new_attributes) { 
     { 
      current_version: 2, 
      publish_version: 2, 
      thumbnail: "uploads/article/thumb/thumb_20170327055055.png", 
      status: "publish", 
      publish_datetime: "2017-04-16 19:51:03", 
      user_id: 2, 
      update_user_id: 3, 
      article_histories_attributes:[ 
      version: 2, 
      title: "Hello! again", 
      content: "World!World!!! <br />" 
      ] 
     } 
     } 

     it 'assigns the article as @article' do 
     article = Article.create! valid_attributes 
     put :update, params: {id: article.to_param, article: new_attributes}, session: valid_session 
     expect(assigns(:article)).to eq(article) 
     end 

この問題を解決するにはどうすればよいですか?

[更新] このようなパラメータをいくつか変更しました。しかし、まだ動作しません。

RSpec.describe ArticlesController, type: :controller do 
    login_admin 

    let(:valid_attributes) { 
    { 
     id: 1, 
     current_version: 1, 
     publish_version: 1, 
     thumbnail: "uploads/article/thumb/thumb_20170327055055.png", 
     status: "publish", 
     publish_datetime: "2017-04-16 19:51:03", 
     user_id: 1, 
     update_user_id: 1, 
     article_histories_attributes:[ 
     version: 1, 
     title: "Hello!", 
     content: "World!World!!!" 
     ] 
    } 
    } 

    describe 'POST #update' do 
    context 'with valid params' do 
     let(:new_attributes) { 
     { 
     id: 1, 
     current_version: 2, 
     publish_version: 2, 
     thumbnail: "uploads/article/thumb/thumb_20170327055055.png", 
     status: "publish", 
     publish_datetime: "2017-04-16 19:51:03", 
     user_id: 2, 
     update_user_id: 3, 
     article_histories_attributes:[ 
     version: 2, 
     title: "Hello! again", 
     content: "World!World!!! <br />" 
     ] 
     } 
     } 
+1

コントローラ{id:article.to_param、article:new_attributes}に渡しています。コントローラは、articleに渡される値が:idキーを含むハッシュであることを期待していますが、変数new_attributesには:idキーが含まれていません。したがって、{article:new_attributes.merge(article.to_param)}を送信して、その変数に追加する必要があります。これは役に立ちます –

+0

コメントありがとうございます。私は結局解決しました。 –

+1

歓迎です。 –

答えて

0

ラインはあなたにActiveRecord::RecordNotFound例外を与えているあなたはarticle内のハッシュにはキーidを持っていない、この1

@article = Article.find(params[:article][:id]) 

です。

+0

ありがとうございます。私はIDを付け加えた。しかし、エラーは同じです。私のアンケートを確認してください。 –

0

あなたはparams [:article] [:id]で見つけようとしますが、あなたのハッシュではありません。あなたのテストでは、あなたがparams [:id]を使ってアクセスできるidを送信します。コントローラにカスタムルートがある場合は、次のような操作を行う必要があります。

class ArticlesController < ApplicationController 
    before_action set_article, only: [:show, :edit, :update, :destroy, :custom_route] 
    # your actions goes here 
    # ... 

    protected 
    def set_article 
     @article ||= Article.find(params[:id] || params[:article][:id]) 
    end 
end 
+0

コメントありがとうございます。私はあなたのアドバイスと一緒に変更しましたが、それでも同じです。私はあなたのレビューのために私の説明を更新しました。 –

関連する問題