问题描述
我正在努力使从网页上查看报告成为可能,但我很努力。此任务使用Sidekiq。
当我单击应该带我到达的链接时,出现错误:“找不到'churn_risk_report'
的动作Admin::ReportsController
。”
在show.html.erb文件的“报告”视图中,我在许多类似的行下方添加了<li><%= link_to 'churn Risk Report',churn_risk_report_admin_reports_path %></li>
,并带有指向其他报告的链接。
我已在我的路线文件的正确位置添加了get 'churn_risk_report'
。
在我的Workers目录中(我认为这是系统的用于Sidekiq作业的Scripts目录的版本),我有一个名为churn_risk_report.rb
的文件,并且在此文件中,我有以下代码:
class churnRiskReport
include Sidekiq::Worker
def perform
csv_temp = Tempfile.new
puts csv_temp.path
CSV.open(csv_temp.path,'wb') do |csv|
csv << ["AAA","BBB","CCC","DDD","EEE","FFF"]
AccountchurnRisk.all.each do |acr|
report_data = [acr.aaa,acr.bbb,"#{acr.ccc} #{acr.ccc}",acr.ddd,acr.eee,acr.fff]
csv << report_data
end
end
report_name = "churn_risk_report"
file_name = "gggggggggg-#{report_name}-#{DateTime.Now.to_date.strftime("%b-%Y")}.csv".downcase
bucket_name = 'hhh-reports'
s3 = AWS::S3.new
key = "reports/churn_reports/" + File.basename(file_name)
x = s3.buckets[bucket_name].objects[key].write(:file => csv_temp.path)
end
end
连续字母=我认为应该保密的代码。这段代码在运行时在Rails控制台中有效,因此我知道该代码有效。
我正在努力完成任务的最后一部分。在Reports控制器中,我定义了churn_risk_report
,并仅使用与Worker文件相同的代码进行了复制。我知道这是不正确的,但是我不确定应该在里面放什么。我认为这里应该有一些代码可以在Workers目录中临时创建一个churn_risk_report
文件,但是事实并非如此。我还认为应该在某个地方涉及“异步”。
在此先感谢您的帮助!
解决方法
这个答案的底部是我专为基本CSV导出逻辑处理而保留的要点,适用于大多数不需要高性能的情况。通常,我将其用作用户下载他们正在当前查看的数据的CSV副本的一种方式(因此,在S3中进行缓存并不是太实用):https://gist.github.com/MyklClason/f6ac68ca4ce1faa5d655abfb0abe788b
取决于报告的大小,将其保存在S3中可能会过多,但可以用作缓存(或长期存储)的一种方式。在这种情况下,在呈现下载链接(指向S3文件本身)之前,您需要检查报告是否已经存在,如果存在,则直接呈现到AWS的链接,如果不存在,则呈现“生成报告”链接,然后在生成报告后,呈现“下载报告”链接。
如果可以自动生成报告,那就更好了,这似乎就是您在原始代码中所做的。尽管我认为“生成报告”按钮可能会使作业排队以运行代码,但是您可能会每月生成报告,或者您可以确切地知道何时需要创建报告,在这种情况下,“生成报告”按钮可能不是不需要,如果报告已生成,您只需提供一个S3下载链接。
要点:
# Good solution for exporting to CSV in rails.
# Source: https://www.codementor.io/victorhazbun/export-records-to-csv-files-ruby-on-rails-vda8323q0
class UsersController < ApplicationController
def index
@users = User.all
respond_to do |format|
format.html
format.csv { send_data @users.to_csv,filename: "users-#{Date.today}.csv" }
end
end
end
class User < ActiveRecord::Base
def self.to_csv
attributes = %w{id email name}
CSV.generate(headers: true) do |csv|
csv << attributes
all.each do |user|
csv << attributes.map{ |attr| user.send(attr) }
end
end
end
end
<%= link_to 'Export CSV',user_path(format: :csv) %>