我正在尝试开发允许我在数据库中保存axslx文件的功能。基本上,我设想了一个EXCEL报告子系统。您可以在哪里创建Excel模板并将其保存在Reports表中。
我正在使用gem 'panoramic'
。它允许我将axslx文件保存在数据库中!但是,为了使它们工作,我必须在控制器中的路径和动作中有一个条目。我可以使用多个条目创建它们,例如report1..report10。但是,这限制了报告的数量。
这是视图代码:
<% reportpath = 'report' + report.report_number.to_s + '.xlsx' %>
<td><%= link_to "Download", report_path(reportpath), :class => 'btn btn-warning btn-xs' %></td>
这是路线:
get "reports/report1"
get "reports/report2"
...
这是控制器代码:
def report1
respond_to do |format|
disposition = 'attachment; filename= ' + '"' + 'report1.xlsx" '
format.xlsx {
response.headers['Content-Disposition'] = disposition
}
end
end
def report2
respond_to do |format|
disposition = 'attachment; filename= ' + '"' + 'report2.xlsx" '
format.xlsx {
response.headers['Content-Disposition'] = disposition
}
end
end
有没有办法使用单一路线和控制器动作?
谢谢!
答案 0 :(得分:0)
如果由于某种原因您无法通过参数传递号码而您想将其包含在路线中,则可以使用dynamic route segments:
get "reports/:report_name" => 'reports#report', constraints: { report_name: /report[0-9]+/ }
在控制器中
def report
report_name = params[:report_name]
respond_to do |format|
disposition = "attachment; filename=\"#{report_name}.xlsx\""
format.xlsx {
response.headers['Content-Disposition'] = disposition
render report_name
}
end
end
<强>更新强>
以更清洁的方式:
resources :reports, only: [:show]
和
def show
report_name = params[:id]
raise ActionController::RoutingError.new('Not Found') unless /report[0-9]+/.match report_name
respond_to do |format|
disposition = "attachment; filename=\"#{report_name}.xlsx\""
format.xlsx {
response.headers['Content-Disposition'] = disposition
render report_name
}
end
end