如何从邮件程序中调用控制器/视图操作?

时间:2013-08-25 09:32:37

标签: ruby-on-rails-3 actionmailer

在我的rails应用程序中,我创建了一份商业日报。显示它有一些非平凡的逻辑(用于在模型中进行过滤的所有类型的可自定义参数,调用该模型的控制器以及用于它的一些非平凡视图,例如,一些列是行 - 跨越几行)。

现在我希望每晚发送此报告(使用固定参数),以及用户在我的网站中生成自定义报告的能力。当然,我希望不要重写/复制我的作品,包括视图。

我的问题是如何从我的邮件程序中调用控制器操作,以便它就像用户请求页面一样(没有作为浏览器发送get请求,当然我希望避免)?

1 个答案:

答案 0 :(得分:3)

回答你的问题是,如果你要生成某种pdf报告,那么使用wicke_pdf gem就可以生成pdf。要在每晚发送报告,最好的办法是实现某种特定时间运行的cron作业,您可以使用whenever gem。你可以这样做:

<强> schedule.rb

every :day, :at => '12:00am'
  runner User.send_report
end

有了这个,您可以看到您调用send_report方法位于User模型类中,如下所示:

<强> User.rb

class User < ActiveRecord::Base 

   def self.send_report
    ReportMailer.report_pdf(@user).deliver
  end
end 

在send_report内部,我们将邮件程序称为ReportMailer,它是我们邮件程序的类名称,方法是report_pdf并传入用户。 但是请记住这是我在这里的一个例子我不确定您在报告中需要的确切信息。

<强>邮件程序

  class ReportMailer< ActionMailer::Base

   default :from => DEFAULT_FROM
     def report_pdf(user)
       @user = user
       mail(:subject => "Overtime", :to => user.email) do |format|
         format.text # renders report.text.erb for body of email
         format.pdf do
           attachments["report.pdf"] = WickedPdf.new.pdf_from_string(
            render_to_string(:pdf => "report",:template => 'report/index.pdf.erb', 
              :layouts => "pdf.html"))
          end
        end
      end
    end 

在邮件程序中,有很多内容正在进行,但最重要的部分是在使用各种format.pdf方法的wicked_pdf块内(假设您正在使用wicked_pdf btw。在块中,您可以创建一个新的WickedPDF pdf对象并将其渲染为字符串。然后为其提供报告的名称,模板和布局。创建模板非常重要。这通常是报告的位置显示来自。文件类型是.pdf.erb这意味着当在视图中生成此视图或报表时,正在解析嵌入的ruby标记,并且输出将是pdf格式。

<强> UserController中

def report
    @user = User.scoped
    if params[:format] == 'pdf'
     #Do some stuff here
      User.send_report(@users)
    end

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

你提出的关键问题是我接受了。

  

如何从我的邮件程序中调用控制器操作

在控制器中简单整理用户范围,然后检查格式是否为pdf,提供它是做一些事情。然后它将运行我之前在用户模型类中突出显示的方法send_report(在你的话中,这是控制器调用模型的Btw)。然后在响应块内有一个format.pdf,以便您可以生成pdf。再次请注意,您需要一个用于pdf核心设计的模板,这与rails在布局中生成application.html.erb的方式类似。但是,我们在这里定义了pdf.html.erb。因此,如果您想在应用程序的其他位置生成另一个pdf,可以在应用程序中再次调用它。

认为我提供了大量信息,可以帮助您朝着正确的方向前进。