"должен получить шоу" тест контроллера не удалось для вложенного ресурса
У меня есть User
модель и Shoppingcart
модель где
# user.rb
class User < ActiveRecord::Base
has_one :shoppingcart
end
а также
# shopppingcart.rb
class Shoppingcart < ActiveRecord::Base
belongs_to :user
end
и у меня есть это в routs.rb:
resources :users do
resource :shoppingcart
end
и в Shoppingcarts_controller.rb у меня есть
class ShoppingcartsController < ApplicationController
def show
@user = User.find(current_user)
@shoppingcart = @user.build_shoppingcart
end
end
и в shoppingcarts_controller_test.rb:
require 'test_helper'
class ShoppingcartsControllerTest < ActionController::TestCase
def setup
@user = users(:michael)
end
test "should get show" do
puts(@user.name) # => Michael Example
puts(@user.id) # => 762146111
get :show # error line
assert_response :success
end
end
Но когда я запускаю тест, я получаю ActiveRecord::RecordNotFound: Couldn't find User with 'id'=
, Когда я закомментирую строку ошибки, ошибка исчезает, и все работает. Что касается не тестового кода, все работает. Я могу достичь users/1/shoppingcart
без проблем, поэтому проблема должна исходить из самого теста. Как сделать тест для действия с вложенным ресурсом?
SessionsHelper.rb:
module SessionsHelper
# Returns the current logged-in user (if any).
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(:remember, cookies[:remember_token])
log_in user
@current_user = user
end
end
end
end
1 ответ
Решение
find
метод требует первичного ключа конкретного пользователя от Users
таблица, а не сам пользователь. Первичный ключ id
, так что вам нужно изменить эту строку в вашем контроллере.
@user = User.find(params[:user_id])