【问题标题】:Download CSV not working with URL in ruby下载 CSV 不适用于 ruby​​ 中的 URL
【发布时间】:2019-08-18 14:58:43
【问题描述】:

我正在尝试通过根 URL 下载 CSV 文件。但它不起作用。我想要做的是当用户输入根 URL http://localhost:3000 然后下载一个 CSV。我无法弄清楚它为什么不起作用的问题。

controller.rb

def index

 csv_string = CSV.generate do |csv|

  file = JSON.parse(File.open("app/assets/javascripts/data.json").read)
    @data = file
    new_file = @data.sort_by!{ |m| m["name"] }
    new_file.each do |hash|
        hash['name'] = (hash.values[2])
        hash['city'] = (hash.values[3])
    end
  end
  respond_to do |format|
    format.html
    format.csv { send_data csv_string, type: :csv }
  end
end

routes.rb

root :to => "name#index"

index.html.erb

<h1 align="center">File is downloaded</h1>

【问题讨论】:

  • csv_string 定义在哪里?
  • @RajdeepSingh 很抱歉这是一个拼写错误。我已将其更改为 csv_string。
  • 发生了什么?您收到错误消息吗?
  • @DanielRikowski 它不会抛出任何错误。只是没有创建 CSV

标签: ruby-on-rails ruby-on-rails-5 export-to-csv


【解决方案1】:

这可能是因为您使用的是 root 路由,它不能有格式参数。

运行rake routes,你会看到如下内容:

         articles GET      /articles(.:format)           
                  POST     /articles(.:format)           
      new_article GET      /articles/new(.:format)       
     edit_article GET      /articles/:id/edit(.:format)  
          article GET      /articles/:id(.:format)       
                  PATCH    /articles/:id(.:format)       
                  PUT      /articles/:id(.:format)       
                  DELETE   /articles/:id(.:format)       
             root GET      /             <------------- NO FORMAT                        

换句话说,格式始终为:html,因此永远不会执行format.csv 块,只会执行format.html 块。

即使有格式参数,您也必须使用 url http://localhost:3000/.csv,这看起来很奇怪,这可能是原因,Rails 无法做到这一点。

首先尝试使用常规资源路由,如下所示:

resources :names

它应该可以使用您现有的代码使用http://localhost:3000/names.csv

如果它有效,那么您可以使用 matchscope 来“美化”您的 URL(如果您确实需要将路由作为根路由)。

像这样:

get '/', to: "name#index", format: :csv

等同于:

match '/', to: "name#index", format: :csv, via: [:get]

【讨论】:

  • 这是我在更改资源路由后遇到的错误:names 如果未指定 HTTP 方法,则不应在路由器中使用 match 方法。如果您想将您的操作公开给 GET 和 POST,请添加 via: [:get, :post] 选项。如果您想将您的操作公开给 GET,请在路由器中使用get:而不是:匹配“controller#action”做:获取“controller#action”
猜你喜欢
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2023-01-26
  • 2021-03-08
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
相关资源
最近更新 更多