在rake任务中需要lib

时间:2013-01-22 10:03:27

标签: ruby-on-rails ruby rake

我在lib / models / alert_import中有一个文件alert_import',我想在我的任务中使用......这样:

task :send_automate_alerts => :environment do
 # STDERR.puts "Path is #{$:}"
  Rake.application.rake_require '../../lib/models/alert_import'
  ai = AlertImport::Alert.new(2)
  ai.send_email_with_notifcations
end

在此代码中,我收到错误:

找不到../../ lib / models / alert_import

在AlertImport中

我有:

module AlertImport

  class Alert

    def initialize(number_days)
      @number_days = number_days
    end

    def get_all_alerts
      alerts = { }
      Organization.automate_import.each do |o|
        last_import = o.import_histories.where(import_type: "automate").last
        last_successful_import = ImportHistory.last_automate_successful_import(o)
        if last_import
          if last_import.created_at + @number_days.days >= Time.now
            alerts[o.id] ="Error during last automate import Last successful import was #{ last_successful_import ? last_successful_import.created_at : "never"}" if last_import.status == "failure"
            alerts[o.id] ="Error during last automate import - status pending Last successful import was #{ last_successful_import ? last_successful_import.created_at : "never"}" if last_import.status == "pending"
          else
            alerts[o.id] = "There were no new files uploaded within #{@number_days} days"
          end
        else
          alerts[o.id] = "The import was never triggered at all"
        end
      end
      alerts
    end

    def send_email_with_notifcations
      alerts =get_all_alerts
      unless alerts.empty?
        AlertMailer.email_notifications(alerts).deliver
      end
    end

  end

end

正确的解决方案是:

desc "Send alerts about automate imports"

task :send_automate_alerts => :environment do
  require "#{Rails.root}/lib/models/alert_import"
  ai = AlertImport::Alert.new(2)
  ai.send_email_with_notifcations
end

5 个答案:

答案 0 :(得分:8)

在Rails 3.x中,我首先使用require导入文件,然后将模块包含在命名空间中,从而取得了成功。以下是它的外观:

require 'models/alert_import'

namespace :alerts

  include AlertImport

  desc 'Send alerts about automate imports'
  task send_automate_alerts: :environment do
    ai = AlertImport::Alert.new(2)
    ai.send_email_with_notifcations
  end

end

答案 1 :(得分:3)

很可能你的路径错了,你可以按照以下方式进行操作

task :send_automate_alerts => :environment do
 # STDERR.puts "Path is #{$:}"
  Rake.application.rake_require "#{Rails.root}/lib/models/alert_import"
  ai = AlertImport::Alert.new(2)
  ai.send_email_with_notifcations
end

"#{Rails.root}"这将为您提供项目的当前路径

答案 2 :(得分:3)

我尝试了一些选项,最值得注意的是尝试rake require,但看起来rake_require的文档不正确。它特别不包括不以.rake

结尾的文件

所以最后,我是“从零开始”做到的 - 这样的事情: ```

namespace :my_namespace do
  task :my_task do
    require File.join(Rails.root, 'app', 'services', 'my_module.rb')

    class Wrapper
      include MyModule
    end
    Wrapper.new.the_method_I_need(args)
  end
end

完成。

答案 3 :(得分:1)

你的路径错了,你可以尝试:

task :send_automate_alerts => :environment do
 # STDERR.puts "Path is #{$:}"
  Rake.application.rake_require "#{Rails.root}/lib/models/alert_import"
  ai = AlertImport::Alert.new(2)
  ai.send_email_with_notifcations
end

问候!

答案 4 :(得分:0)