Rails将xlsx模板保存在数据库中

时间:2014-09-10 21:36:37

标签: ruby-on-rails ruby

我正在尝试开发允许我在数据库中保存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

有没有办法使用单一路线和控制器动作?

谢谢!

1 个答案:

答案 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