2013-08-25 54 views
0

在我的Rails应用程序中,我创建了一份商业日报。有一些非平凡的逻辑来展示它(在模型中用于过滤的所有类型的可定制参数,调用该模型的控制器以及一些非平凡的视图,例如,某些列是行 - 跨越几行)。如何从邮件程序调用控制器/查看操作?

现在,除了用户能够在我的网站上生成自定义报告之外,我希望每晚都发送此报告(使用固定参数)。当然,我不希望重写/复制我的作品,包括观点。

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

回答

3

在回答你的问题是,如果你正在生成某种PDF报告,然后去使用wicke_pdf宝石确实生成PDF文件。要每晚发送一份报告,最好的办法是实施某种在特定时间运行的cron作业,您可以使用whenever gem进行作业。你可以这样做:

schedule.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我们cal l邮件程序是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 

邮包里面有各种各样的事情在进行,但最重要的是,使用各种wicked_pdf方法format.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,我之前在用户模型类中突出显示(用你的话说,这是控制器调用模型)。然后在响应块内部有一个format.pdf,这样你就可以生成pdf。再次请注意,您需要pdf的核心设计模板,这与在轨道中生成application.html.erb的方式类似。但是,在这里我们定义了一个pdf.html.erb。因此,如果你想在你的应用程序的其他地方生成另一个pdf文件,可以在应用程序的任何地方再次调用它。

想想我已经提供了大量的信息,让你走向正确的方向。

+0

感谢您的详细解答。无论如何请注意,我不需要PDF,我想发送HTML页面(反正它不会是PDF),所以我没有尝试使用PDF的全部开销。我的问题是,对render_to_string的调用无法通过生成原始网页的控制器,而无法像网页中那样收集数据。当然,我可以尝试使用重复代码的新控制器,但我希望避免这种情况。我想调用与用于显示网页相同的逻辑。 – user2339344

+0

我认为我应该将邮件处理器视为与控制器平行,复制控制器的次要逻辑(只需调用某个类)并使用“render_as_string”触发视图。 – user2339344

+0

那么在这种情况下,你可以在你的控制器中做类似的事情,并调用'render_to_string',但是这个报告将以什么格式存在? – David

相关问题