0

Railscasts之后,我尝试设置计划的 rake 任务以向管理员用户发送电子邮件:

desc 'Testing rake task to generate email'
task :overtime_report => :environment do

  hospital_bookings = HospitalBooking.scoped
  hospital_booking = hospital_bookings
  user = User.where(:roles => :administrator)


  if params[:format] == 'pdf'
    hospital_bookings = hospital_bookings.where(:day => Date.today.beginning_of_month..Date.today.end_of_month)
  end

  respond_to do |format|
    format.html
    format.pdf do
      render :pdf => "#{Date.today.strftime('%B')} Overtime Report",
             :header => {:html => {:template => 'layouts/pdf.html.erb'}}
      OvertimeMailer.overtime_pdf(user, hospital_booking).deliver
    end
  end
end

控制器

class HospitalBookingsController < ApplicationController

  #load_and_authorize_resource
  before_filter :admin_user, :only => [:index]

  def index
    @hospital_bookings = HospitalBooking.scoped
    system "rake overtime_report Mail_ID=#{params[:id]} &"
    flash[:notice] = 'Delivering Overtime Report'
  end

如果我朝着正确的方向前进,只需要一点指导。

4

1 回答 1

0

恐怕你的代码没有多大意义:

  • rake 任务不是控制器中的操作,因此您使用params并且respond_to根本不起作用。
  • 如果它是按特定时间间隔运行的计划任务,那么您根本不需要控制器。
  • 通过将用户输入以Mail_ID=#{params[:id]}.
  • 将上面的 Mail_ID 选项传递给 rake 任务没有意义,因为它从未使用过。
  • 你永远不应该从控制器调用系统命令。
  • hospital_booking = hospital_bookings没有意义,因为它什么都不做。
  • render也不会做任何事情,这是您创建的 ActionMailer 对象的责任。

你可能想要这样的东西:

desc 'Send hospital bookings overtime report'
task :overtime_report => :environment do
  bookings = HospitalBooking.where(:day => Date.today.beginning_of_month..Date.today.end_of_month).all
  user = User.where(:roles => :administrator).first
  OvertimeMailer.overtime_pdf(user, hospital_bookings).deliver
end
于 2013-04-02T14:32:58.043 回答