【问题标题】:Access devise current_user variable in rails controller在 Rails 控制器中访问设计 current_user 变量
【发布时间】:2013-10-02 22:16:02
【问题描述】:

我有 Rails (4.0) 使用模型 User 运行 Devise gem (3.1.0)。我有一个名为 CollectionsController 的控制器,我想在这个控制器中使用 Devise 的访问器方法 current_user 获取当前登录的用户对象。

然后它返回undefined local variable or method 'current_user' for CollectionsController:Class。最有趣的是,当我尝试在另一个控制器中执行相同操作时,例如 PagesController — 一切正常!
UPD: 共享我的控制器的“代码”: )

class CollectionsController < ActionController::Base
    def index
         @user = current_user
    end
end

current_user 方法的来源是由 Devise 定义的,而不是我。所以我认为这不是问题。

【问题讨论】:

  • 请分享您在 CollectionsController 下的代码以及与 current_user 方法相关的任何代码
  • 该代码是放在一个动作中还是像这样放在控制器的中间?
  • 是的,对不起,它被放在index action 里面
  • 你继承 ActionController::Base 而不是 ApplicationController 有什么原因吗?
  • 各位,抱歉,我找到了问题所在。案例是我在控制器文件夹中创建的用于备份目的的文件夹,似乎存在某种冲突或什么。当我删除它时,一切都开始工作了。至于继承自ActionController::Base 不,没有理由。我刚刚绝望地尝试了所有可用的选项 :) 它对它们都不起作用。

标签: ruby-on-rails devise


【解决方案1】:

current_user 是 Devise 提供给ApplicationController 的一种便捷方法。你的控制器应该继承自它:

class CollectionsController < ApplicationController

您似乎将ActiveRecord::Base(按模型分类)与ActionController(按控制器分类)混为一谈。根据Rails docs

默认情况下,只有 Rails 应用程序中的 ApplicationController 继承自 ActionController::Base。所有其他控制器依次继承自 ApplicationController。

【讨论】:

【解决方案2】:

before_action :authenticate_user! 添加到您的控制器。

见: https://github.com/plataformatec/devise#controller-filters-and-helpers

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。一些控制器可以访问current_user,而其他控制器则不能。在一种情况下,它是一个erb 文件,它正在访问current_user,但只有在询问user_signed_in? 之后,我才添加了检查我的控制器代码,瞧! current_user 可用。

    【讨论】:

      【解决方案4】:

      current_userinstance 方法,而不是 Class 方法。

      注意CollectionsController:Class 提到了Class,这意味着您在类而不是实例中调用current_user

      
      class CollectionsController < ApplicationController
      
        current_user # wrong place. Here, current_user is on the Class.
      
        def index
          current_user # right place. Here, current_user is on the instance.
        end
      end
      

      【讨论】:

        【解决方案5】:
        class CollectionsController < ApplicationController
            include Devise::Controllers::Helpers 
            def index
                 @user = current_user
            end
        end
        
        

        在您的控制器中添加(包括 Devise::Controllers::Helpers),如上所示。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-06
          相关资源
          最近更新 更多