【问题标题】:"NoMethodError: undefined method `admin?' for nil:NilClass" - Test Error“NoMethodError:未定义的方法‘管理员?’对于 nil:NilClass" - 测试错误
【发布时间】:2015-12-15 10:35:30
【问题描述】:

我目前正在通过 Michael Hartl 的 Rails 教程(第 12 章)学习 Ruby on Rails。我突然收到以下错误。

UsersControllerTest#test_should_redirect_destroy_when_not_logged_in: NoMethodError:未定义的方法admin?' for nil:NilClass app/controllers/users_controller.rb:92:inadmin_user' test/controllers/users_controller_test.rb:48:in block (2 levels) in <class:UsersControllerTest>' test/controllers/users_controller_test.rb:47:inblock in '

这是我的测试代码:

test "should redirect destroy when not logged in" do
assert_no_difference 'User.count' do
  delete :destroy, id: @user
end
assert_redirected_to login_url
end

以及我的其余代码:

class UsersController < ApplicationController
before_action :correct_user,   only: [:edit, :update]
before_action :admin_user,     only: :destroy
before_action :logged_in_user, only: [:index, :edit, :update, :destroy,
                                    :following, :followers]

def destroy
User.find(params[:id]).destroy
flash[:success] = "User deleted"
redirect_to users_url
end

def index
@users = User.paginate(page: params[:page])
end

def show
@user = User.find(params[:id])
@microposts = @user.microposts.paginate(page: params[:page])
end

def new
@user = User.new
end

def create
@user = User.new(user_params)
if @user.save
  @user.send_activation_email
  flash[:info] = "Please check your email to activate your account."
  redirect_to root_url
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 following
@title = "Following"
@user  = User.find(params[:id])
@users = @user.following.paginate(page: params[:page])
render 'show_follow'
end

def followers
@title = "Followers"
@user  = User.find(params[:id])
@users = @user.followers.paginate(page: params[:page])
render 'show_follow'
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

有人可以看看并告诉我哪里出错了吗?代码基本上都是从教程里抄过来的,我很茫然。

谢谢。

【问题讨论】:

  • 您的代码找不到current_user。您在哪里为测试用例定义了current_user?你在使用devise gem 吗?

标签: ruby-on-rails


【解决方案1】:

我在 Hartl 教程中遇到了同样的错误。问题是在 users_controller.rb 的清单 9.53 中错过了 :destroy 动作。一旦我发现丢失的位,测试就会恢复为绿色。

也就是说,如果有人能准确解释为什么会这样,那就太好了。

正确的代码:

before_action :logged_in_user, only: [:index, :edit, :update, :destroy]

【讨论】:

    【解决方案2】:

    像这样更改 admin_user 方法:-

    def admin_user
        redirect_to(root_url) unless current_user.present? && current_user.admin?
    end
    

    这将首先检查 current_user 是否存在,然后检查第二个条件(current_user.admin?)。如果 current_user.present?为 false 则不会检查第二个条件。

    【讨论】:

      【解决方案3】:

      您需要更新您的 admin_user 方法以检查用户是否已登录。

      # Confirms an admin user.
      def admin_user
        redirect_to(root_url) if current_user.nil? || !current_user.admin?
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        • 2016-06-15
        • 2013-11-14
        • 2013-01-14
        • 2017-10-02
        相关资源
        最近更新 更多