2015-04-18 72 views
1

我工作的邁克爾·哈特爾的Ruby on Rails的教程中,我遇到了一個錯誤在第9章hartl 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/integration/users_index_test.rb:11:in `block in <class:UsersIndexTest>' 

36 runs, 79 assertions, 0 failures, 1 errors, 0 skips 

FILE:測試/集成/ users_index_test.rb

require 'test_helper' 

class UsersIndexTest < ActionDispatch::IntegrationTest 

    def setup 
    @user =  users(:michael) 
    @non_admin = users(:archer) 
    end 

    test "index as admin including pagination and delete links" do 
    log_in_as(@admin) 
    get users_path 
    assert_template 'users/index' 
    assert_select 'div.pagination' 
    first_page_of_users = User.paginate(page: 1) 
    first_page_of_users.each do |user| 
     assert_select 'a[href=?]', user_path(user), text: user.name 
     unless user == @admin 
     assert_select 'a[href=?]', user_path(user), text: 'delete', 
                method: :delete 
     end 
    end 
    assert_difference 'User.count', -1 do 
     delete user_path(@non_admin) 
    end 
    end 

    test "index as non-admin" do 
    log_in_as(@non_admin) 
    get users_path 
    assert_select 'a', text: 'delete', count: 0 
    end 
end 

FILE:測試/ test_helper.rb中

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 

我不能FIGUR e出了如何解決這個錯誤...任何幫助非常感謝!

編輯:

FILE:應用程序/控制器/ user_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 

FILE:DB/schema.rb

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 
+0

您在哪裏定義'@ admin'?因爲你正在調用'log_in_as(@admin)',但是我沒有看到它的定義。 –

+0

您沒有在任何地方定義'@ admin' – forthowin

+0

我能想到的唯一地方是user_controller.rb文件或db/schema.rb文件。我附上了兩個,但我仍然不確定如何解決這個問題。 –

回答

4

在測試的設置,您需要將@user更改爲@admin

def setup 
    @admin = users(:michael) 
    @non_admin = users(:archer) 
    end 

這是測試其餘部分引用的實例變量名稱。由於您沒有正確設置,因此@adminnil,導致錯誤

+0

太棒了!謝謝dwenzel和所有評論過的人!回到教程! –

相關問題