错误:未定义的方法`admin?'为零:NilClass

时间:2015-05-28 19:30:16

标签: ruby-on-rails

我将在接近尾声时阅读Michael Hartl Rails Tutorial,但仍然坚持参见清单12.29中的测试。我得到的两个错误是:

[BsonSerializer(typeof(MyCustomSerializer))]
public string Property1 { get; set; }
[BsonSerializer(typeof(MyCustomSerializer))]
public string Property2 { get; set; }

users_controller_test.rb

test_should_redirect_following_when_not_logged_in#UsersControllerTest (1432024588.37s) ActionView::Template::Error:         ActionView::Template::Error: undefined method `admin?' for nil:NilClass

test_should_redirect_followers_when_not_logged_in#UsersControllerTest (1432024588.39s)ActionView::Template::Error:         ActionView::Template::Error: undefined method `admin?' for nil:NilClass

sessions_helper.rb

 test "should redirect following when not logged in" do
    get :following, id: @user
    assert_redirected_to login_url
  end

  test "should redirect followers when not logged in" do
    get :followers, id: @user
    assert_redirected_to login_url
  end

先谢谢,如果我需要发布更多代码,请告诉我,因为我是Rails的新手。

更新#2,users_controller.rb

# Returns true if the given user is the current user.   
  def current_user?(user)   
    user == current_user    
  end

  # 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

2 个答案:

答案 0 :(得分:2)

错误发生在您的视图代码中 - 您调用@user.admin?current_user.admin?之类的地方。根据您的测试标题判断,如果用户未登录(例如@user / current_usernil),则会检查该用户是否已重定向。

检查您的观看代码是否有.admin?的来电 - 当您没有用户时,该通话就会中断。

有几个修复程序,其中一个是尝试.admin?调用,例如:

current_user.try(:admin?)

:try将在:admin?上调用给定方法(current_user),但如果nil没有current_user,则会默默返回admin?方法(在这种情况下它没有,因为current_usernil)。

答案 1 :(得分:1)

当遇到同样的错误并且发疯时,遇到了这个。

我的错误非常简单,我不小心有了旧版本的

before_action :logged_in_user,

在我的UsersController中

看起来像这样,必须只是偶然添加它,而不是双重检查和复制和粘贴的数量钉它:

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

删除了第二个,所以只有这个,错误消失了:

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