2016-02-29 4 views
0

Я Googled это и не могу показаться, чтобы найтиВызов помощника приложения Rails в Sidekiq работника

class MyWorker 

    include Sidekiq::Worker 
    include ApplicationHelper 

    worker code.... etc.... 

    myapphelper(arg) 

end 

У меня есть простой рабочий, который в конце называет помощник приложения, но я получаю:

NoMethodError: undefined method `myapphelper' 

Я думал, что добавление include ApplicationHelper сделало бы трюк.

UPDATE

Так давайте добавим еще некоторые детали. Помощник (который на самом деле был на самом деле методом в моем контроллере приложения), вопрос был первоначально это:

def add_history(resource, action, note) 

    resource.history.create(action: action, note: note, user_id: current_user.id) if resource.present? && action.present? && note.present? 

end 

Идея здесь у меня есть быстрый способ добавить бумажный след к модели. Я понял, что, возможно, я не должен передавать реальный объект в метод, потому что (как указано в документах Sidekiq), если этот объект изменится, вы можете попасть в беду. Так что я изменил его на это:

def add_history(klass, id , action, note) 

    resource = klass.constantize.find_by(id: id) 
    resource.history.create(action: action, note: note, user_id: current_user.id) if resource.present? && action.present? && note.present? 

    end 

Теперь, когда я включаю это как модуль current_user.id терпит неудачу, потому что это установлено в ApplicationController.

Так что давайте пересмотреть мой вопрос: было бы лучше всего добавить current_user.id в качестве аргумента в мой модульный метод или каким-то образом сохранить его в Application Controller и т. Д.?

Если я полностью отслежен здесь, и этот тип логики должен идти куда-то еще, пожалуйста, дайте мне знать.

+1

ApplicationHelpers не предназначены для использования внутри ничего, кроме видов. Подумайте о переносе своего метода на простой старый модуль и включите его. –

+0

Хммм ... ты прав ... Я думаю, что я полностью подошел к этому помощнику. Если вы добавите это как ответ, я соглашусь с ним, потому что это правильно, как издалека, как я могу сказать, даже если вы указали на очевидное для меня :) –

+0

включение не работает, потому что этот модуль выходит за рамки рабочего видения. Вам также понадобится этот файл, например 'require '/ filepath'' –

ответ

2

Вы можете выполнить поведение, делая что-то вроде:

class HistoryWorker 
    include Sidekiq::Worker 
    include History # or whatever you want to call it 

    def perform(klass, id , action, note, user_id) 
    add_history(klass, id, action, note, user_id) 
    end 

end 

module History 
    def add_history(klass, id, action, note, user_id) 
    resource = klass.constantize.find_by(id: id) 
    resource.history.create(action: action, note: note, user_id: user_id) if resource.present? && action.present? && note.present? 
    end 
end 

class ApplicationController < ActionController::Base 
    after_filter :save_history 

    def save_history 
    HistoryWorker.perform_async(class: resource.class.name, id: resource.id, action: params[:action], note: 'some note', user_id: current_user.id) 
    end 
end 

Извиняется за любые тупые синтаксические ошибки, но это более или менее структуру Вы хотите.

Это говорит о том, что использование модуля, вероятно, будет излишним в этом случае, особенно если вы не собираетесь повторно использовать его метод в другом месте. В этом случае я просто добавлю частный метод внутри рабочего.

+0

Это в значительной степени то, что я сделал. Я сохранил это как прямой модуль, так как я буду называть это по всему моему приложению, так как различные строки создаются, обновляются и т. Д. Я укажу, что именование вашего модуля так же, как и имя вашей модели, имеет проблемы. Я сделал то, что у вас есть, и после перезагрузки моего приложения у меня были всевозможные ошибки. Я не вникал в это слишком много, потому что было проще просто переименовать его «HistoryModule» и «History» –

+0

О, интересно. Возможно, вы используете драгоценный камень или какой-то сторонний код, который уже востребовал пространство имен History, так как я не думаю, что Rails объявляет это где угодно. В любом случае, рад, что вы разобрались. –

Смежные вопросы