Ruby on rails hartl rails教程第9章电子邮件方法错误?
我正在编写Michael Hartl的Ruby on Rails教程,在第9章中遇到了一个错误 错误:Ruby on rails hartl rails教程第9章电子邮件方法错误?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在编写Michael Hartl的Ruby on Rails教程,在第9章中遇到了一个错误 错误: 1) Error: UsersIndexTest#test_index_as_admin_including_pagination_and_delete_links: NoMethodError: undefined method `email' for nil:NilClass test/test_helper.rb:18:in `log_in_as' test/inte
1) Error:
UsersIndexTest#test_index_as_admin_including_pagination_and_delete_links:
NoMethodError: undefined method `email' for nil:NilClass
test/test_helper.rb:18:in `log_in_as'
test/integration/users_index_test.rb:11:in `block in <class:UsersIndexTest>'
36 runs, 79 assertions, 0 failures, 1 errors, 0 skips
我不知道如何修复这个错误。。。非常感谢您的帮助
编辑:
文件:app/controllers/user\u 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.paginate(page: params[:page])
end
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
log_in @user
flash[:success] = "Welcome to the Sample App!"
redirect_to @user
else
render 'new'
end
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
flash[:success] = "Profile updated"
redirect_to @user
else
render 'edit'
end
end
def destroy
User.find(params[:id]).destroy
flash[:success] = "User deleted"
redirect_to users_url
end
private
def user_params
params.require(:user).permit(:name, :email, :password,
:password_confirmation)
end
# Before filters
# Confirms a logged-in user.
def logged_in_user
unless logged_in?
store_location
flash[:danger] = "Please log in."
redirect_to login_url
end
end
# Confirms the correct user.
def correct_user
@user = User.find(params[:id])
redirect_to(root_url) unless current_user?(@user)
end
# Confirms an admin user.
def admin_user
redirect_to(root_url) unless current_user.admin?
end
end
在测试设置中,您需要将@user更改为@admin:
这是在测试的其余部分中引用的实例变量名。由于未正确设置,@admin为零,导致测试设置中出现错误,因此需要将@user更改为@admin:
这是在测试的其余部分中引用的实例变量名。由于设置不正确,@admin为零,导致错误您在哪里定义@admin?因为您正在呼叫登录_as@admin但是我不知道它是在哪里定义的。你没有定义@admin,我能想到的唯一地方就是user_controller.rb文件或db/schema.rb文件。我已经附加了这两个,但我仍然不确定如何解决这个问题。你在哪里定义@admin?因为您正在呼叫登录_as@admin但是我不知道它是在哪里定义的。你没有定义@admin,我能想到的唯一地方就是user_controller.rb文件或db/schema.rb文件。我已经附上了两个,但我仍然不确定如何解决这个问题。太好了!谢谢dwenzel和所有发表评论的人!回到教程!伟大的谢谢dwenzel和所有发表评论的人!回到教程!
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
class ActiveSupport::TestCase
fixtures :all
# Returns true if a test user is logged in.
def is_logged_in?
!session[:user_id].nil?
end
# Logs in a test user.
def log_in_as(user, options = {})
password = options[:password] || 'password'
remember_me = options[:remember_me] || '1'
if integration_test?
post login_path, session: { email: user.email,
password: password,
remember_me: remember_me }
else
session[:user_id] = user.id
end
end
private
# Returns true inside an integration test.
def integration_test?
defined?(post_via_redirect)
end
end
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.paginate(page: params[:page])
end
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
log_in @user
flash[:success] = "Welcome to the Sample App!"
redirect_to @user
else
render 'new'
end
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
flash[:success] = "Profile updated"
redirect_to @user
else
render 'edit'
end
end
def destroy
User.find(params[:id]).destroy
flash[:success] = "User deleted"
redirect_to users_url
end
private
def user_params
params.require(:user).permit(:name, :email, :password,
:password_confirmation)
end
# Before filters
# Confirms a logged-in user.
def logged_in_user
unless logged_in?
store_location
flash[:danger] = "Please log in."
redirect_to login_url
end
end
# Confirms the correct user.
def correct_user
@user = User.find(params[:id])
redirect_to(root_url) unless current_user?(@user)
end
# Confirms an admin user.
def admin_user
redirect_to(root_url) unless current_user.admin?
end
end
ActiveRecord::Schema.define(version: 20150418002759) do
create_table "users", force: :cascade do |t|
t.string "name"
t.string "email"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "password_digest"
t.string "remember_digest"
t.boolean "admin", default: false
end
add_index "users", ["email"], name: "index_users_on_email", unique: true
end
def setup
@admin = users(:michael)
@non_admin = users(:archer)
end