首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4- Resque背景工作中的印象主义者

Rails 4- Resque背景工作中的印象主义者
EN

Stack Overflow用户
提问于 2016-04-12 18:33:53
回答 3查看 471关注 0票数 4

我使用Rails 4w/印象派和浮雕宝石。

我正在使用印象主义者在我的文章显示页面上记录唯一的会话点击。由于性能问题和不需要显示点击给用户(这是只为管理员),我想把日志印象移到后台。

通常,我会用impressionist(@article, unique: [:session_hash])记录一个印象,但是为了通过resque将它移到bg中,我现在正在做这样的事情.

articles_controller:

代码语言:javascript
复制
def show
  .
  .
  .
  Resque.enqueue(ImpressionLogger, @article.id)
end

app/workers/Importinglogger.rb:

代码语言:javascript
复制
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。你们认为做这件事最好的方法是什么?我不知道如何将印象派的方法纳入我的研究工作者。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-29 19:28:58

The issue

您的问题源于这样一个事实,即由于在任何impressionist实例的引擎初始化器中包含一个带有ActionController方法的模块,印象主义者在控制器级别上工作:

https://github.com/charlotte-ruby/impressionist/blob/master/lib/impressionist/engine.rb#L11

您试图从Resque作业中调用的常规类调用印象主义方法,因此不会定义该方法。

溶液

有点恶心,但如果你真的想用印象派,我们可以深入研究.查看印象派这里方法的实际实现,我们看到以下内容:

代码语言:javascript
复制
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

假设您将手动调用类似的内容(就像您希望从一个重发作业中调用的那样),关键是以下三行:

代码语言:javascript
复制
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课程将成为:

代码语言:javascript
复制
class ImpressionLogger 
  @queue = :impression_queue

  def self.perform(article_id, impression_params = {})
    article = Article.find(article_id)
    article.impressions.create(impression_params)
  end
end

您的控制器方法应该如下所示:

代码语言:javascript
复制
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的一部分,因此这段代码可能会在创业板的不同版本之间中断。

票数 2
EN

Stack Overflow用户

发布于 2016-04-12 19:17:56

印象主义者是否正确地安装了邦德勒?如果是这样的话,Rails应该将其加载到您的环境中。我将检查您是否可以访问Rails代码中的其他地方的impressionist功能(即,无需通过Resque),这是调试Rails代码的第一步。

票数 1
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36581348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档