Я следую вместе с руководством по рельсам Майкла Хартла и делаю небольшие корректировки. Пользователи могут создавать микросообщения (обновления статуса) в своих профилях, после чего страница будет перезагружаться и будет отображаться новый статус. Я могу подтвердить вручную, что это работает точно так, как предполагалось. Проблема в том, что тесты для него не проходят по какой-то причине, хотя конечный результат вне тестов выглядит идеально.«Нельзя перенаправить на ноль!»
Скриншоты microposts_controller.rb, microposts_interface_test.rb (тест отсутствии), соответствующие сообщения об ошибках, и users_controller.rb, в таком порядке: http://imgur.com/a/IS1HI
microposts_controller.rb
class MicropostsController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy]
before_action :correct_user, only: :destroy
def create
@micropost = current_user.microposts.build(micropost_params)
if @micropost.save
flash[:success] = "Status updated!"
redirect_to @user
else
@feed_items = []
flash[:warning] = "Status was blank!"
redirect_to @user
end
end
def destroy
@micropost.destroy
flash[:success] = "Status deleted."
redirect_to @user
end
microposts_interface_test.rb
:
require 'test_helper'
class MicropostsInterfaceTest < ActionDispatch::IntegrationTest
def setup
@user = users(:mrtestit)
end
test "micropost interface" do
log_in_as(@user)
assert is_logged_in?
# Invalid submission
assert_no_difference 'Micropost.count' do
post microposts_path, micropost: { content: "" }
end
# Valid submission
content = "This status really ties the room together"
assert_difference 'Micropost.count', 1 do
post microposts_path, micropost: { content: content }
end
follow_redirect!
assert_match content, response.body
# Delete a post.
assert_select 'a', text: 'delete'
first_micropost = @user.microposts.paginate(page: 1).first
assert_difference 'Micropost.count', -1 do
delete micropost_path(first_micropost)
end
# Visit a different user.
get user_path(users(:archer))
assert_select 'a', text: 'delete', count: 0
end
end
users_controller.rb
class UsersController < ApplicationController
before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
before_action :correct_user, only: [:edit, :update]
before_action :admin_user, only: :destroy
def index
@users = User.where(activated: true).paginate(page: params[:page])
end
def show
@user = User.find(params[:id])
if logged_in?
@micropost = current_user.microposts.build
@feed_items = current_user.feed.paginate(page: params[:page])
end
@microposts = @user.microposts.paginate(page: params[:page])
redirect_to root_url and return unless @user.activated?
end
Я понимаю, что по какой-то причине это говорит о том, что @user
является nil
. Тем не менее, я неоднократно подтверждал, что redirect_to @user
работает везде.
Тот факт, что все остальные испытания проходят, является доказательством этого, но для того, чтобы пройти лишнюю милю, я подтвердил, что строка кода ошибки redirect_to @user
работает в других файлах, например, когда пользователь обновляет свою информацию о профиле под их страницей настроек и затем перенаправляется на страницу своего профиля. Я потратил более 10 часов на это (в основном вчера), и я нахожусь на грани простого удаления этого теста и продолжения своей жизни. Stackoverflow - мое последнее средство.
Введите код в вопрос, а не ссылки на скриншоты –
Я теперь сделал то, что вы просили. – Display