【问题标题】:Ruby on Rails - undefined local variable or method in rake taskRuby on Rails - rake 任务中未定义的局部变量或方法
【发布时间】:2018-06-02 01:39:25
【问题描述】:

我为 Mailer 创建了一个 Rake 任务,以便稍后使用 Crontab 安排并使用 Gem 自动执行,以便向用户发送电子邮件。暂时只是一个测试,以了解任务是否有效。

我的 Rake Task 和 Mailer 如下。

require 'rake'

desc 'send digest email'
task send_warn_course: :environment do
  MailCourseWarnMailer.course_available(user).deliver!
end

# And my Mailer is:
class MailCourseWarnMailer < ActionMailer::Base

  def course_available(user)
    @user = user
    mail(to: @user.email, subject: "Curso disponível")
  end

end

我将参数传递给任务,但这不起作用。当我运行rake send_warn_course 时出现错误:

rake send_warn_course
rake aborted!
NameError: undefined local variable or method `user' for main:Object

有人知道发生了什么吗?我在这里错过了什么?

【问题讨论】:

    标签: ruby-on-rails ruby rake-task


    【解决方案1】:

    正如错误提示您没有定义User

    您需要输入电子邮件ID或用户ID,并需要从数据库中找到用户,然后将其传递给函数。

    类似于以下内容:

    require 'rake'
    
    desc 'send digest email'
    task :send_warn_course, [:user_email] => :environment do |t, args|
      user = User.find_by_email args[:user_email]
      MailCourseWarnMailer.course_available(user).deliver!
    end
    
    # And my Mailer is:
    class MailCourseWarnMailer < ActionMailer::Base
    
      def course_available(user)
        @user = user
        mail(to: @user.email, subject: "Curso disponível")
      end
    
    end
    

    然后,您可以像这样运行任务:

    rake send_warn_course['user@email.com']
    

    由于它是一个调度程序任务,您可能不想为每个任务传递一个变量,而是希望执行一些数据库查询来查找相关用户。但这只是为了演示错误的修复。

    【讨论】:

    • 我该怎么做?直接在梅勒?谢谢。
    • 我没明白你在问什么?
    • 对不起,我没有看到他的答案更新就问了。现在它正在工作,但我需要它是自动的,以某种方式在运行rake send_warn_course 时将 Rake 任务发送给我数据库中的所有用户。我在这里尝试,但碰巧,你有一些提示给我吗?谢谢。 :D
    • 好吧,我对你的想法很感兴趣! :)
    • 如何在这个任务中从我的数据库中获取电子邮件?我正在尝试但没有成功:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多