我在我的应用程序中添加了csv导出和分页功能。
parent.rb
CSV_HEADER = %w[parent_1_firstname parent_1_lastname address]
def self.to_csv
CSV.generate do |csv|
csv << CSV_HEADER
all.each do |parent|
csv << [
parent.parent_1_firstname,
parent.parent_1_lastname,
parent.address
]
end
end
end
controller.rb
def main_admin
require 'csv'
add_breadcrumb "Admin"
@filterrific = initialize_filterrific(
Parent,
params[:filterrific],
select_options: {
with_status: Parent.options_for_status
}
) or return
@parents = @filterrific.find.paginate(:page => params[:page], :per_page => 10)
respond_to do |format|
format.html
format.js
format.csv { send_data @parents.to_csv }
end
rescue ActiveRecord::RecordNotFound => e
puts "Had to reset filterrific params: #{ e.message }"
redirect_to(reset_filterrific_url(format: :html)) and return
end
我面临的问题是当我单击main_admin.html.erb页面上的Download CSV时。下载的CSV只是前10个父级,但不止于此。像大约300位父母一样。我无法解决问题。请帮助。
更新
if params[:format] == 'csv' then @filterrific.find.paginate(:page => params[:page], :per_page => 10)
respond_to do |format|
format.csv { send_data @parents.to_csv }
else
@parents = @filterrific.find.paginate(:page => params[:page], :per_page => 10)
respond_to do |format|
format.html
format.js
end
答案 0 :(得分:0)
您已经使单个控制器动作响应csv,html或js,这很好,但是您只能处理代表所有父项的单个对象-@parents。您的@parents实例变量始终在操作的所有三个响应者中分页。要解决此问题,您将需要使用父级的第二种表示形式,即父级的 all 来进行CSV导出:
respond_to do |format|
format.html
format.js
format.csv { send_data Parent.all.to_csv }
end
如果需要,别忘了重新添加Filterific逻辑。
应注意,在此示例中,即使不使用CSV导出,也要创建@parents对象,因此应将其移到html和js响应器中以停止额外的操作不必要的查询。
答案 1 :(得分:0)
将代码更改为仅在格式不是csv的情况下使用分页
@parents = @filterrific.find
@parents = @parents.paginate(:page => params[:page], :per_page => 10) unless request.format == 'csv' #does pagination if not csv format
respond_to do |format|
format.html
format.js
format.csv { send_data @parents.to_csv }
end