索引页面未呈现,但下载了csv

时间:2019-08-18 13:13:05

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

我正在使用Rails应用程序,该应用程序读取JSON数据,然后根据该数据创建CSV。我面临的问题是CSV下载工作正常,但索引页面没有显示。

当我进入localhost:3000时,下载了CSV,但未呈现index.html.erb页面。请帮助我找出问题所在。

controller.rb

def index
  csv_data = 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
  send_data csv_data, type: :csv
end

routes.rb

root :to => "name#index"

index.html.erb

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

如果我在控制器索引操作中添加以下代码,则将呈现html,但下载的csv停止工作。

respond_to do |format|
 format.html
 format.csv { send_data csv_data, type: :csv }
end

2 个答案:

答案 0 :(得分:0)

您需要添加html格式作为响应格式:

def index
  csv_data = ..
  respond_to do |format|
    format.html
    format.csv { send_data csv_data }
  end
end

答案 1 :(得分:0)

1 /以一种私有方法提取CSV逻辑:

def download_csv
  csv_data = 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
  send_data csv_data, type: :csv
end

2 /在before_action内部调用您的私有方法:

before_action :download_csv, only: :index

3 /将您的路线默认设置为html可能不是必需的):

root :to => "name#index", defaults: { format: 'html' }

从前操作基本调用send_file/send_data不会暂停请求周期,因为它不使用renderredirect_to

希望对您有帮助。

__编辑的答案__

实际上,我猜想为一个action绘制多条路线不是正常的习惯。我认为您应该找到另一种方法来实现这一目标。我建议您使用以下代码(来自我的第一个解决方案):

1 /添加特定的下载路径

get '/name/download_csv', to: "name#download_csv"

2 /在您的视图中添加一些Jquery

<script>
  $(document).ready(function() {
    window.location.href = 'name/download_csv.csv';
  })
</script>

3 //从控制器中删除private保留字

通过这种方式,每次您进入index view时,您将在整个download中调用Jquery动作。 这并不是真正的“轨道方式”,但应该可以。

让我知道它是否有效。