在我的 Rails 应用程序中,我创建了一份商业日报。显示它有一些重要的逻辑(用于在模型中过滤的所有类型的可定制参数,调用该模型的控制器和一些重要的视图,例如,某些列是行-跨越几行)。
现在我希望每晚发送此报告(使用固定参数),此外用户还可以在我的网站中生成自定义报告。当然,我不希望重写/复制我的工作,包括视图。
我的问题是如何从我的邮件程序中调用控制器操作,这样就好像该页面是由用户请求的一样(而不是作为浏览器发送 get 请求,当然我希望避免这种情况)?
在我的 Rails 应用程序中,我创建了一份商业日报。显示它有一些重要的逻辑(用于在模型中过滤的所有类型的可定制参数,调用该模型的控制器和一些重要的视图,例如,某些列是行-跨越几行)。
现在我希望每晚发送此报告(使用固定参数),此外用户还可以在我的网站中生成自定义报告。当然,我不希望重写/复制我的工作,包括视图。
我的问题是如何从我的邮件程序中调用控制器操作,这样就好像该页面是由用户请求的一样(而不是作为浏览器发送 get 请求,当然我希望避免这种情况)?
回答您的问题是,如果您正在生成某种 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,则可以在您的应用程序的任何地方再次调用它。
认为我已经提供了大量信息来引导您朝着正确的方向前进。