0

在我的 Rails 应用程序中,我创建了一份商业日报。显示它有一些重要的逻辑(用于在模型中过滤的所有类型的可定制参数,调用该模型的控制器和一些重要的视图,例如,某些列是行-跨越几行)。

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

我的问题是如何从我的邮件程序中调用控制器操作,这样就好像该页面是由用户请求的一样(而不是作为浏览器发送 get 请求,当然我希望避免这种情况)?

4

1 回答 1

3

回答您的问题是,如果您正在生成某种 pdf 报告,那么使用wicke_pdf gem 确实可以生成 pdf。要每晚发送报告,最好的办法是实现某种在特定时间运行的 cron 作业,您可以使用whenge gem 来完成。您可以执行以下操作:

日程安排.rb

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

有了这个,您可以看到您调用的send_report方法位于 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 对象并渲染它到一个字符串。然后为它提供报告的名称、模板和布局。创建模板很重要。这通常是报告显示的位置。文件类型是 a.pdf.erb这意味着当这个视图或报告在正在解析嵌入的 ruby​​ 标签的视图中生成,并且输出将是 pdf 格式。

用户控制器

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我之前在用户模型类中突出显示的方法(顺便说一句,这是调用模型的控制器)。然后在响应块内有一个format.pdf这样你就可以生成pdf。再次注意,您需要一个用于 pdf 核心设计的模板,这类似于 rails 在布局中生成 application.html.erb 的方式。但是在这里我们定义了一个 pdf.html.erb。因此,如果您想在其他地方的应用程序中生成另一个 pdf,则可以在您的应用程序的任何地方再次调用它。

认为我已经提供了大量信息来引导您朝着正确的方向前进。

于 2013-08-25T10:51:44.010 回答