布尔模型属性为自动方法

时间:2010-07-13 12:26:13

标签: ruby-on-rails ruby

我正在完成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

4 个答案:

答案 0 :(得分:2)

好消息!你的rspec测试发现了一个bug!

您的控制器方法

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添加到a​​pp / controllers / users_controller.rb中的before_filter :authenticate,如下所示(来自{ {3}}:

before_filter :authenticate, :only => [:index, :edit, :update, :destroy]