Попытка вызвать вспомогательный модуль в schedule.rake - PullRequest
0 голосов
/ 22 марта 2020

В scheduler.rake у меня есть этот метод:

task :email_unaccepted_meetings => :environment do
  desc "If meeting time is less than 3 days away, and not accepted, send email to requestee"
  @date_plus_three_days = Time.now + 3.days
  @meetings = Meeting.where("status = ? AND accepted != ? AND meeting_time < ? ", "Active", true, @date_plus_three_days)
    if @meetings != nil
      @meetings.each do |meeting|
        EmailAndPushHelper.unaccepted_lex_request(meeting.id)
      end
    end
end

и в /controllers/concerns/email_and_push_helper.rb У меня есть это:

module EmailAndPushHelper
  def unaccepted_lex_request(meeting_id)
    puts meeting_id
    @meeting = Meeting.find(meeting_id)
    if(check_settings(@meeting.requestee_id, 'lex_email') == true)
      MeetingMailer.unaccepted_mtg_request(@meeting).deliver_later
    end

    if(check_settings(@meeting.requestee_id, 'lex_push'))
      @title = "A Lex request needs your response."
      @message = "#{@meeting.requestor.preferred_name} is waiting for your response.'"
      @data  = {
        "status": "ok",
        "body": @message,
        "title": @title,
        "meetingId": @meeting.id
      }

      PushNotificationWorker.perform_async(@meeting.requestee.id, @title, @message, @data)
    end
  end
end

Когда я вызываю задачу email_unaccepted_meetings Я получаю NoMethodError (undefined method 'unaccepted_lex_request' for EmailAndPushHelper:Module)

В других задачах с граблями я вызываю методы Mailer, методы Worker, поэтому я не совсем понимаю, что здесь происходит. Я пытался запросить файл в scheduler.rake, но выдает ту же ошибку, из-за чего я полагаю, что он обращается к файлу /controllers/concerns/email_and_push_helper.rb, но не может найти метод unaccepted_lex_request по какой-то причине?

Заранее благодарим за помощь!

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Чтобы объявить методы модуля, вам нужно определить метод с помощью self.

module EmailAndPushHelper
  def self.unaccepted_lex_request(meeting_id)
    # ...
  end
end

Методы экземпляра модуля доступны только в том случае, если вы включаете или расширяете что-то еще с помощью модуля. Не как метод самого модуля.

Но это действительно неправильное место / название для этого кода. controller/concerns - это действительно то место, куда вы кладете миксины, которые смешиваются в вашем контроллере Кроме того, это не действительно помощник, который также является чрезвычайно расплывчатым термином, который также обычно означает миксин, который используется в представлении, а иногда и в контроллере в Rails.

Этот код фактически принадлежит заданию или объекту службы.

class EmailAndPushJob < ApplicationJob
  queue_as :default

  def perform(meeting)
    # You will have to solve the NoMethodError here
    if check_settings(meeting.requestee_id, 'lex_email')
      MeetingMailer.unaccepted_mtg_request(meeting).deliver_later
    end
    if check_settings(meeting.requestee_id, 'lex_push')
      title = "A Lex request needs your response."
      message = "#{meeting.requestor.preferred_name} is waiting for your response.'"
      PushNotificationWorker.perform_async(meeting.requestee.id, title, message, {
        # Use strings or symbols!
        "status" => "ok",
        "body" => message,
        "title" => title,
        "meetingId" => meeting.id
      })
    end
  end
end

Вы также хотите использовать партии в своей задаче рейка вместо просто .each, поскольку это загрузит каждую запись в память и создаст sh ваш сервер, как только вы получите достойную количество данных.

task :email_unaccepted_meetings => :environment do
  desc "If meeting time is less than 3 days away, and not accepted, send email to requestee"
  meetings = Meeting.where(
     status: "Active", 
     accepted: true, 
     meeting_time: Time.now..3.days.from_now
  ).find_each do |meeting|
    EmailAndPushJob.perform_now(meeting)
  end
end
0 голосов
/ 23 марта 2020

Я решил добавить это в начало scheduler.rake

require "#{Rails.root}/app/controllers/concerns/email_and_push_helper.rb"
include EmailAndPushHelper

И назвать его так:

    `EmailAndPushHelper::unaccepted_lex_request(meeting.id)`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...