我正在尝试访问控制器外部的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
我认为没有办法做到这一点。如果您有任何想法,欢迎您。
答案 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 。