我正在完成http://railstutorial.org(目前正在制定第10.4.2节 - 销毁用户)。
我的用户模型有一个布尔admin
属性,在Users控制器中有一些使用此属性的简单代码:
def admin_user
redirect_to(root_path) unless current_user.admin?
end
RSpec测试:
describe "as a non-signed-in user" do
it "should deny access" do
delete :destroy, :id => @user
response.should redirect_to(signin_path)
end
end
此测试产生的错误:
''UsersController DELETE'中的NoMethodError'作为非登录用户销毁'应该拒绝访问' 未定义的方法`admin?'为零:NilClass
什么是零:NilClass?我为什么要这个?
编辑: j。,这可能有所帮助:
def sign_in(user)
user.remember_me!
cookies[:remember_token] = { :value => user.remember_token,
:expires => 20.years.from_now.utc }
self.current_user = user
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= user_from_remember_token
end
答案 0 :(得分:2)
您的控制器方法
def admin_user
redirect_to(root_path) unless current_user.admin?
end
由控制器的删除操作直接或间接调用。
当current_user为nil时调用admin_user。因此admin_user方法失败并显示错误
undefined method `admin?' for nil:NilClass
修复:取决于如何调用和使用admin_user。它是在过滤器中吗?
可以更改为
之一def admin_user
redirect_to(root_path) unless current_user && current_user.admin?
end
# or
def admin_user
redirect_to(root_path) if current_user && !current_user.admin?
end
取决于具体情况......
答案 1 :(得分:0)
看起来你的current_user对象是nil,它应该是nil。
由于你没有登录,那么你当前的_user是肯定的,然后你就试着去了 nil.admin?所以这就是为什么它没有给出方法错误。
顺便说一句,你应该重写一下类似
的方法def admin_user
redirect_to(root_path) unless current_user || current_user.admin?
end
答案 2 :(得分:0)
您是否完成了本教程的9.3.4 Current User部分?这会通过包含current_user
模块在SessionsController
内创建SessionsHelper
变量。
答案 3 :(得分:0)
我遇到了这个问题,我发现潜在的问题是我无法将:destroy
添加到app / controllers / users_controller.rb中的before_filter :authenticate
,如下所示(来自{ {3}}:
before_filter :authenticate, :only => [:index, :edit, :update, :destroy]