2013-08-25 52 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

相關問題