Rails 5.0.1渲染到Excel不起作用



我有一个应用程序,可以帮助学校跟踪学生参加体育练习和比赛的情况,我有所有的索引操作来呈现html、csv和xls格式,一切都很好。我有一个特殊的报告,它使用几个模型关系来完成,我不需要呈现csv(我认为这对于实现to_csv方法来说太复杂了,我甚至不知道把它放在哪里,但这不是我的问题),现在我创建了equpos_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

app/controllers/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

我已经创建了app/views/equipos/reporte_asist.xls.erb文件,其中包含..中的XML指令

<?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/mimit_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

将要POST的参数添加到reporte_asist_path助手中,如下所示:

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

更多信息可在此处找到:http://api.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html#method-i-url_for

还要注意,虽然Rails支持对链接使用POST方法,但它依赖于JavaScript。如果用户禁用了JavaScript,则请求将返回到GET方法。所以使用表格更安全。

最新更新