【问题标题】:How to solve ActiveRecord::RecordNotFound? [closed]如何解决 ActiveRecord::RecordNotFound? [关闭]
【发布时间】:2017-05-13 07:42:52
【问题描述】:

我不明白为什么 RSpec 会出错。 错误信息如下。

  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 />"
      ]
      }
      }

【问题讨论】:

  • 您正在传递给控制器​​ { id: article.to_param, article: new_attributes} 。控制器期望传递给 article 的值是一个包含 :id 键的散列,但是变量 new_attributes 不包含 :id 键。因此,您必须通过发送 { article: new_attributes.merge(article.to_param) } 将其添加到该变量中。这会工作
  • 感谢您的评论。我终于解决了。

标签: ruby-on-rails ruby rspec


【解决方案1】:

该行给你一个ActiveRecord::RecordNotFound 例外是这个

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

article 内的哈希中没有密钥 id

【讨论】:

  • 谢谢。我附上了身份证。但错误仍然相同。请检查我的调查问卷。
【解决方案2】:

您尝试使用 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

【讨论】:

  • 感谢您的评论。不过,我根据您的建议进行了修改,仍然相同。我已经更新了我的描述以供您查看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2018-01-30
  • 2013-11-01
  • 1970-01-01
相关资源
最近更新 更多