Вопрос
Ваша проблема связана с тем, что она выглядит как импрессионистов на уровне контроллера за счет включения модуля с помощью метода impressionist
в инициализаторе двигателя на любых случаях ActionController:
https://github.com/charlotte-ruby/impressionist/blob/master/lib/impressionist/engine.rb#L11
Вы пытаетесь вызвать импрессионист метод из обычного класса, вызываемого в Resque-задании, поэтому он не будет определять этот метод.
Решение
Это своего рода грубых, но если вы действительно хотите использовать импрессионист, мы можем углубиться в это ... Глядя на фактической реализации импрессиониста метода найден here, мы видим следующее:
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
Предполагая, что вы бы называть что-то вроде этого вручную (как вы хотите от Resque работы) ключ эти три линии:
if unique_instance?(obj, opts[:unique])
obj.impressions.create(associative_create_statement({:message => message}))
end
Обертка, если кажется, важна, если вы хотите реализовать функциональность this. Кажется, что это так. Вызов associative_create_statement
, по-видимому, вытягивает параметры, основанные на имени контроллера, а также параметры, переданные из Rack, такие как строка useragent и IP-адрес (here). Таким образом, вам придется решить эти значения до вызова 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-интерфейса импрессионистского gem, поэтому этот код может сломаться tween версии драгоценного камня.
Кроме того, чтобы прояснить, это не то, что можно просто решить, включив/расширив ImpressionistController в классе Resque, поскольку он полагается на доступ к базовым параметрам Rack, а также такие вещи, как имя контроллера для входящего запрос. Чтобы заставить его работать то же самое, вам придется разрешить параметры в контроллере, а затем передать их в Resque. – photoionized
Большое вам спасибо за это. Это действительно работает и будет выполняться как быстрое исправление. просто нужно потратить время и развернуть свое собственное решение. @photoionized – Kathan