【问题标题】:Struggling to get a CSV Report to load when requested努力获取 CSV 报告以在请求时加载
【发布时间】:2020-09-17 16:24:26
【问题描述】:

我正在尝试使从网页上查看报告成为可能,但我很苦恼。此任务使用 Sidekiq。

当我单击应该将我带到那里的链接时,我收到错误消息:“找不到Admin::ReportsController 的操作'churn_risk_report'。”

在 show.html.erb 文件的“报告”视图中,我在多个类似行下方添加了<li><%= link_to 'Churn Risk Report', churn_risk_report_admin_reports_path %></li>,并带有指向其他报告的链接。

我已在我的 Routes 文件的正确位置添加了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 文件,但情况可能并非如此。我也认为应该在某处涉及“异步”。

提前感谢您的帮助!

【问题讨论】:

  • 从错误消息中,问题与控制器/路由有关。你能展示这些的相关部分吗?
  • 你好。是的,它们如下。在 routes.rb 文件中我有:resource :reports, only: [:show] do ... get 'churn_risk_report' ... end 在控制器文件中我有:```def churn_risk_report ...(没有足够的空间来写它。一切都在“包括 Sidekiq::Worker”和上面原始问题中的第三个“结束”)...结束如果我误解了您的评论,请告诉我,这些不是您正在谈论的代码。再次感谢:)
  • 那么,你能验证类Admin::ReportsController 确实有一个churn_risk_report 方法吗?顺便说一句,您可以编辑您的问题以添加代码......不需要将其放入评论中......
  • 谢谢,我不知道。可以肯定的是,Admin::ReportsController 表示我的 Admin 目录中的 report_controller.rb 文件不是吗?如果是这样,那么是的,它确实有一个 churn_risk_report 方法。
  • 不仅仅是文件名。你也必须这样定义类。

标签: ruby-on-rails ruby csv sidekiq


【解决方案1】:

在这个答案的底部,是我专门为基本 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) %>

【讨论】:

    猜你喜欢
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2018-04-14
    • 2021-12-07
    • 2022-08-15
    • 1970-01-01
    相关资源
    最近更新 更多