在我的Rails應用程序中,我創建了一份商業日報。有一些非平凡的邏輯來展示它(在模型中用於過濾的所有類型的可定製參數,調用該模型的控制器以及一些非平凡的視圖,例如,某些列是行 - 跨越幾行)。如何從郵件程序調用控制器/查看操作?
現在,除了用戶能夠在我的網站上生成自定義報告之外,我希望每晚都發送此報告(使用固定參數)。當然,我不希望重寫/複製我的作品,包括觀點。
我的問題是,如何從我的郵件程序中調用控制器動作,這樣就好像該頁面是用戶請求的(當然,我不希望避免發送get請求作爲瀏覽器) ?
在我的Rails應用程序中,我創建了一份商業日報。有一些非平凡的邏輯來展示它(在模型中用於過濾的所有類型的可定製參數,調用該模型的控制器以及一些非平凡的視圖,例如,某些列是行 - 跨越幾行)。如何從郵件程序調用控制器/查看操作?
現在,除了用戶能夠在我的網站上生成自定義報告之外,我希望每晚都發送此報告(使用固定參數)。當然,我不希望重寫/複製我的作品,包括觀點。
我的問題是,如何從我的郵件程序中調用控制器動作,這樣就好像該頁面是用戶請求的(當然,我不希望避免發送get請求作爲瀏覽器) ?
在回答你的問題是,如果你正在生成某種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文件,可以在應用程序的任何地方再次調用它。
想想我已經提供了大量的信息,讓你走向正確的方向。
感謝您的詳細解答。無論如何請注意,我不需要PDF,我想發送HTML頁面(反正它不會是PDF),所以我沒有嘗試使用PDF的全部開銷。我的問題是,對render_to_string的調用無法通過生成原始網頁的控制器,而無法像網頁中那樣收集數據。當然,我可以嘗試使用重複代碼的新控制器,但我希望避免這種情況。我想調用與用於顯示網頁相同的邏輯。 – user2339344
我認爲我應該將郵件處理器視爲與控制器平行,複製控制器的次要邏輯(只需調用某個類)並使用「render_as_string」觸發視圖。 – user2339344
那麼在這種情況下,你可以在你的控制器中做類似的事情,並調用'render_to_string',但是這個報告將以什麼格式存在? – David