【问题标题】:Boolean model attributes as automatic methods布尔模型属性作为自动方法
【发布时间】:2010-07-13 12:26:13
【问题描述】:

我正在处理http://railstutorial.org(目前正在处理第 10.4.2 节 - 销毁用户)。

我的用户模型有一个布尔值admin 属性,并且在用户控制器中有一些使用该属性的简单代码:

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 'destroy' 中的 NoMethodError 作为非登录用户应拒绝访问” 未定义的方法“管理员?”对于 nil:NilClass

什么是 nil: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

【问题讨论】:

  • 看起来current_user 为零。
  • Daniel,将其更改为 @current_user 后出现同样的错误
  • 检查current_user 方法。它正在返回nil。可以发一下这个方法吗?
  • j.,你是对的,current_user 是零。它在sign_in 初始化,此测试不会发生这种情况,因为我正在测试尚未登录的用户。我的用户控制器代码中有before_filter :admin_user, :only => :destroy,它在调用destroy 时触发admin_user。
  • 对。所以拉里K的答案是要走的路。您必须使用unless current_user && current_user.admin? 测试current_user 是否存在:]

标签: ruby-on-rails ruby


【解决方案1】:

好消息!您的 rspec 测试发现了一个错误!

你的控制器方法

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

视情况而定....

【讨论】:

    【解决方案2】:

    看起来你的 current_user 对象是 nil,它应该是 nil。

    由于您没有登录,那么您当前的 _user 肯定是 nil,然后您正在尝试获取 无管理员?所以这就是它给出 No method 错误的原因。

    也许你应该重写你的方法

    def admin_user
      redirect_to(root_path) unless current_user || current_user.admin?
    end
    

    【讨论】:

      【解决方案3】:

      您是否完成了教程的9.3.4 Current User 部分?这通过包含SessionsHelper 模块在SessionsController 中创建一个current_user 变量。

      【讨论】:

        【解决方案4】:

        我遇到了这个确切的问题,我发现根本问题是我未能将:destroy 添加到 app/controllers/users_controller.rb 中的before_filter :authenticate,如下所示(来自listing 10.41

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-20
          • 2012-06-23
          • 2021-03-08
          • 2014-04-01
          • 1970-01-01
          • 2018-09-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多