如何访问控制器和模型之外的'current_user'

时间:2017-12-01 12:33:59

标签: ruby-on-rails

我正在尝试访问控制器外部的current user和模型外部。这是项目的架构

main_engine
|_bin
|_config
|_blorgh_engine
    |_ —> this where devise is installed
|
|_ blorgh2_engine
    |_app
        |_assets
        |_models
        |_assets
        |_queries
            |_ filter_comments.rb -> Where I want to use current_user
 module Blorgh2
    # A class used to find comments for a commentable resource
    class FilterComments < Rectify::Query
      # How to get current_user here ?
    ...
    end
 end

我认为没有办法做到这一点。如果您有任何想法,欢迎您。

3 个答案:

答案 0 :(得分:1)

current_user变量与当前请求相关联,因此与控制器实例相关联。在这种情况下,您可能只需要parameterize your query与要筛选的用户:

class FilterComments < Rectify::Query
  def initialize(user)
    @user = user
  end

  def query
    # Query that can access user
  end
end

然后,在你的控制器中:

filtered_comments = FilterComments.new(current_user)

这清楚地说明了它的来源,允许您与任何用户重复使用它,并使查询对象可测试,因为您只需传入测试设置中的任何用户。

答案 1 :(得分:1)

如果引擎在同一个线程中运行,那么也许你可以将current_user存储在线程中。

class ApplicationController < ActionController::Base

  around_action :store_current_user

  def store_current_user
    Thread.current[:current_user] = current_user
    yield
    ensure
    Thread.current[:current_user] = nil
  end

end

然后在filter_comments.rb中,您可以定义方法

def current_user
  Thread.current[:current_user]
end

答案 2 :(得分:1)

在我的应用程序中,我正在使用作用于当前正在执行的线程的变量。这是Rails 5的功能,它确实有助于解决这种超出范围的问题。

blogpost中的想法。

基于Module#thread_mattr_accessor

的实现

这里是代码示例。

python

现在,您可以在所有应用范围内访问当前线程中的 Current.user