我正在使用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
答案 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
不会暂停请求周期,因为它不使用render
或redirect_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
动作。
这并不是真正的“轨道方式”,但应该可以。
让我知道它是否有效。