2016-03-27 3 views
0

Я нахожусь на Rails 4, используя Resque w/Redis.Использование метода контроллера с параметром Resque Background

Мой вопрос: Как я могу использовать метод контроллера, который в настоящее время определен в моем приложении_controller, внутри моей фоновой работы?

Вот текущий метод, который я определил:

def push_to_google(token, message) 
    if token.present? 
    gcm = GCM.new("843jf9384fj839f848j890fj3") 
    registration_ids = ["#{token}"] # an array of one or more client registration tokens 
    options = {data: {notification: "#{message}"}} 
    response = gcm.send(registration_ids, options) 
    end 
end 

, который я хотел бы использовать в этом фоне работе, определенной в моих delayed_notifications:

class DelayedNotifications 
    @queue = :notifications_queue 

    def self.perform(registration_id, user_name) 
    push_to_google(registration_id, "New message from #{user_name}.") 
    end 
end 

Конечно, мои работы в настоящее время неудачи с этой ошибкой:

undefined method 'push_to_google' for DelayedNotifications:Class

Спасибо за помощь заранее.

ответ

1

Extract (перемещение) push_to_google в ApplicationHelper и включают ApplicationHelper в вашем ApplicationController, а также DelayedNotifications.

После изменений, ваш application_helper.rb должно быть:

module ApplicationHelper 
    # other methods 

    def push_to_google(token, message) 
    if token.present? 
     gcm = GCM.new("843jf9384fj839f848j890fj3") 
     registration_ids = ["#{token}"] # an array of one or more client registration tokens 
     options = {data: {notification: "#{message}"}} 
     response = gcm.send(registration_ids, options) 
    end 
    end 
end 

application_controller.rb:

class ApplicationController < ActionController::Base 
    include ApplicationHelper 

end 

delayed_notifications.rb:

class DelayedNotifications 
    include ApplicationHelper 

    @queue = :notifications_queue 

    def self.perform(registration_id, user_name) 
    push_to_google(registration_id, "New message from #{user_name}.") 
    end 
end 
+0

Я бы не ставил это в 'ApplicationHelper' но выделенный модуль где-то в 'lib /'. Ваш подход кажется мне довольно опасным, так как он добавляет все методы, определенные в 'ApplicationHelper', как действия контроллера. По этой причине я бы включил метод как закрытый. – BoraMa

+0

Спасибо за ваш комментарий, я думаю, что возьму этот подход. Есть ли какие-либо преимущества в том, чтобы поместить мой модуль в каталог 'lib' и каталог' helpers'? @BoraMa – Kathan

+0

@ Kathan Существует небольшая разница. [Помощники Rails] (http://api.rubyonrails.org/classes/ActionController/Helpers.html) (т.е. модули в каталоге 'app/helpers') предназначены для [перемещения сложной логики из представлений] (http: //mixandgo.com/blog/the-beginner-s-guide-to-rails-helpers), т. е. они обычно имеют дело с представлением данных. Кроме того, по умолчанию все помощники включены в пространство имен представления (они автоматически используются из представлений). Каталог 'lib' используется для любых модулей поддержки вообще. Поскольку ваш код, похоже, не касается презентации, я бы поместил его в 'lib'. – BoraMa