未定义的局部变量或方法'current_user'

时间:2015-02-05 08:05:01

标签: ruby-on-rails

在我的ApplicationController中,有current_use

 private

  def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
  end

  def logged_in?
    !!session[:user_id]
  end

logged_in?并验证是否有效。但是,当我改变

<% if logged_in? %>

<% if logged_in? && current_user.free? %>

在views / top / index.html.erb中,发生以下错误。

NameError at /

undefined local variable or method `current_user' for #<#<Class:...>:...>

我该如何解决这个问题?

free?在user.rb中定义为

def free?
  visit.game.count == 0
end

如果我将current_user更改为@current_user,则错误消息如下所示。

NoMethodError at /
undefined method `free?' for nil:NilClass

2 个答案:

答案 0 :(得分:5)

只需尝试将其添加到您的应用程序控制器:

helper_method :current_user

这样做是因为它将私有方法作为辅助方法,并且可以在所有控制器和视图中访问它。希望这会有所帮助。

答案 1 :(得分:0)

在使用 Pundit gem和 JWT gem进行身份验证的 Rails 6 仅API应用程序上工作时,我遇到了这个问题。

在尝试测试控制器操作的 Pundit 授权时,我遇到了此错误:

NameError:#Api :: V1 :: SchoolsController:0x00007f30a4918120 \ n的未定义局部变量或方法“ current_user” \ n您是什么意思? @current_user

这是我的固定方式

权威似乎无法使用current_user方法,因此它在找不到该错误时抛出了该错误。

我只是在pundit_user文件中定义了一个app/controllers/application_controller.rb

class ApplicationController < ActionController::API
  include Pundit

  def pundit_user
    header = request.headers['Authorization']
    header = header.split(' ').last if header
    @decoded = JsonWebToken.decode(header)
    User.find(@decoded[:user_id])
    rescue ActiveRecord::RecordNotFound => e
      render json: { errors: e.message }, status: :unauthorized
    rescue JWT::DecodeError => e
      render json: { errors: e.message }, status: :unauthorized
  end
end

仅此而已。

我希望这会有所帮助