ActiveRecord::RecordNotFound: не удалось найти должника с id=

Я недавно преобразовал проект из MongoDB/mongoid в PostgreSQL. После перехода все мои спецификации моделей проходят, и у меня проходит большинство спецификаций контроллера. Три из моих контроллеров не проходят тесты, хотя.

Модели Alert, Order и User зависят от моделей Client и Debtor в соответствии с приведенными ниже определениями моделей:

class Client < ActiveRecord::Base
  has_many :users, autosave: true, dependent: :destroy
  has_many :alerts, autosave: true, dependent: :destroy
  has_many :orders, autosave: true, dependent: :destroy

  ...
end

class Debtor < ActiveRecord::Base
  has_many :orders, autosave: true
  has_many :alerts, autosave: true

  ...
end

class Alert < ActiveRecord::Base
  belongs_to :client
  belongs_to :debtor

  ...
end

class Order < ActiveRecord::Base
  belongs_to :client
  belongs_to :user
  belongs_to :debtor

  ...
end

class User < ActiveRecord::Base
  rolify

  devise :database_authenticatable, 
     :recoverable, :rememberable, :trackable, :validatable

  has_and_belongs_to_many :roles, :join_table => :users_roles
  belongs_to :client
  has_many :orders
end

Почти все неудачные тесты имеют одинаковую ошибку (в некоторых есть "Не удалось найти клиента с id= "):

 129) OrdersController logged in as a regular user GET #new renders the new template
 Failure/Error: get :new, client_id: @user.client_id
 ActiveRecord::RecordNotFound:
   Couldn't find Debtor with id=
 # ./spec/controllers/orders_controller_spec.rb:59:in `block (4 levels) in <top (required)>'

Я запустил db:test: подготовить и удалить, создать, перенести последовательность.

Обновление: вот связанные спецификации от orders_controller_spec.rb и соответствующего контроллера. Я новичок в rspec, так что я сейчас извинюсь, если before(:each) Блок является преступлением против человечества.

require 'spec_helper'

describe OrdersController do
  before (:each) do
    @user, @user2, @user3, @admin = FactoryGirl.create(:user), FactoryGirl.create(:user), FactoryGirl.create(:user), FactoryGirl.create(:user)
    @client, @client2 = FactoryGirl.create(:client), FactoryGirl.create(:client)
    @debtor, @debtor2, @debtor3 = FactoryGirl.create(:debtor), FactoryGirl.create(:debtor), FactoryGirl.create(:debtor)
    @order, @order2, @order3, @order4 = FactoryGirl.create(:order), FactoryGirl.create(:order), FactoryGirl.create(:order),FactoryGirl.create(:order)
    @role = FactoryGirl.create(:role)
    @admin_role = FactoryGirl.create(:admin_role)
    @vip_role = FactoryGirl.create(:vip_role)
    @user.roles << @role
    @user2.roles << @vip_role
    @user3.roles << @role
    @admin.roles << @admin_role
    @client.users << @user << @admin
    @client.orders << @order << @order2
    @client2.users << @user2 << @user3
    @client2.orders << @order3 << @order4
  end

  context "logged in as a regular user" do
    before { sign_in @user }

    describe "GET #index" do
      before { get :index, client_id: @user.client_id }

      it "assigns a list of orders belonging to user client" do
        assigns(:orders).to_a.should eq([@order, @order2])
      end
      it "renders the :index template" do
        response.should render_template :index, client_id: @user.client_id
      end
    end

    describe "GET #show" do
      context "for order belonging to user client" do
        before { get :show, client_id: @user.client_id, id: @order }

        it "assigns the requested order to @order" do
          assigns(:order).should eq(@order)
        end
        it "renders the :show template" do
          response.should render_template :show, client_id: @user.client_id, id: @order
        end
      end

      context "for order not belonging to user client" do
        before { get :show, client_id: @client2.id, id: @order3 }

        it "redirects to the home view" do
          response.should redirect_to root_url
        end
      end 
    end

    describe "GET #new" do
      it "renders the new template" do
        get :new, client_id: @user.client_id
        response.should render_template :new, client_id: @user.client_id
      end
    end

    ...
  end
end

Связанные действия контроллера:

class OrdersController < ApplicationController
  before_filter :authenticate_user!
  before_filter :load_client
  before_filter :has_enough_units, :only => [:create]
  respond_to :html
  load_and_authorize_resource :debtor
  load_and_authorize_resource :order, :through => :client, :shallow => true

  def index
    if @client == nil
      @orders = Order.all
    else
      @orders = @client.orders.all
    end
    respond_with(@orders)
  end

  def show
    if @client == nil
      @order = Order.find(params[:id])
    else
      @order = @client.orders.find(params[:id])
    end
  end

  def new
    if current_user.has_role? :admin
      @order = Order.new
    else
      @order = @client.orders.build
    end
    @order.build_debtor
    @clients = Client.all.to_a
  end

  ...
end

Надеюсь, этого достаточно информации...

0 ответов

Другие вопросы по тегам