未定义的局部变量或方法'request' - 在控制器助手中

时间:2018-02-12 13:19:40

标签: ruby-on-rails ruby-on-rails-4

我们一直看到越来越多的错误与同一个呼叫视线:

NameError: undefined local variable or method 'request' for :false:Symbol

他们都来自位于lib的身份验证帮助程序。这种方法在99%的时间内成功运行(我们知道因为它会毫无问题地将您登录)。但是,对于极少数的请求,找不到request对象,如错误消息所示。

我们已经为各种用户代理看到了这一点。对于它的价值,ApplicationController包括(通过include)有问题的助手。

在Rails请求期间,是否存在request可能丢失的常见调试技术或已知问题?如果有帮助,cookies也会出现同样的情况。

相关的代码:

# lib/authenticated_system.rb
module AuthenticatedSystem
  def logged_in?
    current_user != :false
  end

  def current_user
    @current_user ||= login_via_cookie || login_via_url || :false
    @current_user
  end

  def login_via_cookie
    Rails.logger.info "IP: #{request.ip}" # example of accessing request
    if token = cookies[:web_token]
      User.find_by(auth_token: token)
    end
  end

  def login_via_url
    # return User or nil
  end
end

# app/controllers//foo_controller.rb
class FooController < ApplicationController
  include Alerting

  def show
    log_alert(current_user)
  end
end

# lib/alerting.rb
module Alerting
  def log_alert(user)
    Rails.logger.info "User: #{user.id}" # example of accessing user
  end
end

1 个答案:

答案 0 :(得分:1)

此代码不正确...

@current_user ||= login_via_cookie || login_via_url || :false

将@current_user设置为符号:false

最好将其设置为对象false或更好,让它默认为nil

@current_user ||= (login_via_cookie || login_via_url)

并将logged_in?更改为...

def logged_in?
  !!current_user
end

在你的一个lib模块的某个时刻,我怀疑你正在调用导致问题的current_user.request