Rails 5.0.1渲染到Excel不起作用

我有一个应用程序,帮助学校跟踪学生参加体育运动和游戏,我有我所有的索引行动,以呈现HTML,CSV和XLS格式,一切都好。 我有一个特殊的报告,使用几个模型关系来完成,我不需要渲染csv(我认为这将是太复杂的实施to_csv方法,我什至不知道把它放在哪里,但这是不是我的问题),现在我创build了equipos_controller#forma_rep方法和一个窗体相关的视图来获取报表参数,正如你可以在路由和控制器代码中看到的,当你的报表动作呈现默认的HTML可以在以下日志中看到,“forma_rep.html.erb”表单中的参数在params数组中。

Started POST "/equipos/reporte_asist" for 127.0.0.1 at 2017-01-05 18:37:51 -0600 Processing by EquiposController#reporte_asist as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"IP1O2bSgkGcSaUn5Sf9Tnp30yzxfP10+cA0h/1+XudoR7W8SoP6xveP3fwJpLFTvyRaBFdtqsqz5pCfYID5b5Q==", "entrenador"=>"1", "inicio"=>"2016-12-12", "final"=>"2016-12-20", "commit"=>"Crear Reporte"} ... most SQL ommited Rendering equipos/reporte_asist.html.erb within layouts/application Rendered equipos/reporte_asist.html.erb within layouts/application (69.4ms) Rendered layouts/_shim.html.erb (0.5ms) CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] Rendered layouts/_header.html.erb (5.9ms) Rendered layouts/_footer.html.erb (1.1ms) Completed 200 OK in 210ms (Views: 165.2ms | ActiveRecord: 5.6ms) 

但是当我点击“Excel”链接时:

 Started POST "/equipos/reporte_asist.xls" for 127.0.0.1 at 2017-01-05 18:37:56 -0600 Processing by EquiposController#reporte_asist as XLS Parameters: {"authenticity_token"=>"oYVjNfxN5Qxt9FHC6PpeU0wQenD3p+otaxcGts1kZRuQlUL+6 BPE1pxqZznIKVkiGPIwWXPyBb/ivgCRss2HJA=="} User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] Equipo Load (0.2ms) SELECT "equipos".* FROM "equipos" WHERE "equipos"."user_id" = ? [["user_id", 1]] Completed 500 Internal Server Error in 11ms (ActiveRecord: 0.4ms) NoMethodError (undefined method `<<' for nil:NilClass): app/controllers/equipos_controller.rb:96:in `block in reporte_asist' app/controllers/equipos_controller.rb:95:in `reporte_asist' 

我可以看到,当我单击HTML文件中的Excel链接时,参数不完整,我怎么能再次发送它们? 我的路线工作正常的HTML版本和#index行动呈现在所有格式罚款, 请帮助我 。 这里是涉及的所有代码。

路线:

 resources :categorias get '/equipos/forma_rep' post '/equipos/reporte_asist', to: 'equipos#reporte_asist', as: 'reporte_asist' resources :equipos resources :players 

应用程序/控制器/ equipos_controller.rb

 def index @equipos = Equipo.paginate(page: params[:page]) respond_to do |format| format.html format.csv { send_data @equipos.to_csv } format.xls end end # GET /equipos/forma_rep def forma_rep @equipo = Equipo.new @entrenadores = User.all end # PUT /equipos/reporte_asist def reporte_asist if params[:entrenador] @entrenador = User.find(params[:entrenador].to_i) inicio = Time.parse(params[:inicio]) final = Time.parse(params[:final]) @equipos = @entrenador.equipos @eventos = reporte(@entrenador.id, inicio, final) else @entrenador = current_user @equipos = @entrenador.equipos @equipos.each do |equi| @eventos << equi.eventos end end respond_to do |format| format.html format.xls end end 

我用XML指令创build了app / views / equipos / reporte_asist.xls.erb文件。

 <?xml version="1.0"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <Worksheet ss:Name="Asistencias"> <Table> <Row> <Cell><Data ss:Type="String">Entrenador:</Data></Cell> <Cell><Data ss:Type="String"><%= @entrenador.name %></Data> </Cell> </Row> ....etc. 

这是我在app / views / equipos / reporte_asist.html.erb中的链接

 <p> Descargar: <%= link_to "Excel", reporte_asist_path(format: "xls"), method: :post %> </p> 

当然我已经在config / initializers / mime_types.rb中定义了Mime:Type.register,并在我的config / application.rb中请求了'csv'库。 我正在使用Rails 5.0.0.1和Ruby 2.3.1 …

这是从用户收集报告参数的代码,它在发布到reporte_asist.html.erb的app / views / equipos / forma_rep.html.erb中:

 <h1>Reporte de Asistencias</h1> <%= form_tag(reporte_asist_path) do %> <%= label_tag(:entrenador, "Entrenador:") %> <%= select_tag :entrenador, options_from_collection_for_select(@entrenadores, "id", "name"), prompt: "Seleccione el entrenador", class: 'form-control' %> <%= label_tag(:inicio, "Fecha inicial de reporte:") %> <%= date_field_tag :inicio, class: 'form-control' %> <%= label_tag(:final, "Fecha final de reporte:") %> <%= date_field_tag :final, class: 'form-control' %> <%= submit_tag "Crear Reporte", class: "btn btn-default" %> <% end %> </div> 

最初这是发送报告参数的代码,但是一旦在报告视图中,我不能(也不想)重新渲染窗体,这就是为什么我把link_to放到同一个控制器上,但是试图渲染excel

将你想要发布的参数添加到你的reporte_asist_path帮手中,如下所示:

 reporte_asist_path(format: 'xls', entrenador_id: @entrenador.id) 

更多信息可以在这里find: http : //api.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html#method-i-url_for

另外请注意,虽然Rails支持使用POST方法进行链接,但它依赖于JavaScript。 如果用户禁用JavaScript,请求将回退到GET方法。 所以使用表单更安全。