我使用Rails 4w/印象派和浮雕宝石。
我正在使用印象主义者在我的文章显示页面上记录唯一的会话点击。由于性能问题和不需要显示点击给用户(这是只为管理员),我想把日志印象移到后台。
通常,我会用impressionist(@article, unique: [:session_hash])记录一个印象,但是为了通过resque将它移到bg中,我现在正在做这样的事情.
articles_controller:
def show
.
.
.
Resque.enqueue(ImpressionLogger, @article.id)
endapp/workers/Importinglogger.rb:
class ImpressionLogger
@queue = :impression_queue
def self.perform(article_id)
article = Article.find(article_id)
impressionist(article, unique: [:session_hash])
end
end当我像这样设置它时,当resque试图处理作业时,它将返回undefined method "impressionist" for ImpressionLogger:Class。你们认为做这件事最好的方法是什么?我不知道如何将印象派的方法纳入我的研究工作者。
发布于 2016-04-29 19:28:58
The issue
您的问题源于这样一个事实,即由于在任何impressionist实例的引擎初始化器中包含一个带有ActionController方法的模块,印象主义者在控制器级别上工作:
https://github.com/charlotte-ruby/impressionist/blob/master/lib/impressionist/engine.rb#L11
您试图从Resque作业中调用的常规类调用印象主义方法,因此不会定义该方法。
溶液
有点恶心,但如果你真的想用印象派,我们可以深入研究.查看印象派这里方法的实际实现,我们看到以下内容:
def impressionist(obj,message=nil,opts={})
if should_count_impression?(opts)
if obj.respond_to?("impressionable?")
if unique_instance?(obj, opts[:unique])
obj.impressions.create(associative_create_statement({:message => message}))
end
else
# we could create an impression anyway. for classes, too. why not?
raise "#{obj.class.to_s} is not impressionable!"
end
end
end假设您将手动调用类似的内容(就像您希望从一个重发作业中调用的那样),关键是以下三行:
if unique_instance?(obj, opts[:unique])
obj.impressions.create(associative_create_statement({:message => message}))
end如果您想要实现这功能,则if包装似乎很重要。看上去你就是这么做的。对associative_create_statement的调用似乎是根据控制器名称以及从Rack传递的参数(如useragent字符串和ip地址(这里) )来提取参数。因此,您必须在调用Resque作业之前解析这些值。
现在我建议实现一个Resque类,它接受两个参数,一个article_id和您想要的印象参数。然后,resque类将直接在易受影响的对象上创建印象。您的Resque课程将成为:
class ImpressionLogger
@queue = :impression_queue
def self.perform(article_id, impression_params = {})
article = Article.find(article_id)
article.impressions.create(impression_params)
end
end您的控制器方法应该如下所示:
def show
.
.
.
Resque.enqueue(ImpressionLogger, @article.id, associative_create_statement({message: nil})) if unique_instance?(@article, [:session_hash])
end免责声明
但是这样做有一个相当大的免责声明.方法associative_create_statement被标记为受保护,unique_instance?被标记为私有.因此,这两种代码都不是印象主义创业板的公共API的一部分,因此这段代码可能会在创业板的不同版本之间中断。
发布于 2016-04-12 19:17:56
印象主义者是否正确地安装了邦德勒?如果是这样的话,Rails应该将其加载到您的环境中。我将检查您是否可以访问Rails代码中的其他地方的impressionist功能(即,无需通过Resque),这是调试Rails代码的第一步。
发布于 2016-04-12 21:20:44
你是怎么开始工作的?如果需要加载Rails环境,请尝试rake environment resque:work。
https://github.com/resque/resque/wiki/FAQ#how-do-i-ensure-my-rails-classesenvironment-is-loaded
https://stackoverflow.com/questions/36581348
复制相似问题