【问题标题】:Rails 5.0.1 Rendering to Excel not workingRails 5.0.1 渲染到 Excel 不起作用
【发布时间】:2017-01-06 21:05:09
【问题描述】:

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

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

我已经使用 XML 指令创建了 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 ...

这是从用户那里收集报告参数的代码,它位于 app/views/equipos/forma_rep.html.erb 中,发布到 reporte_asist.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 放到同一个控制器但试图渲染优秀的

【问题讨论】:

    标签: ruby-on-rails ruby excel csv


    【解决方案1】:

    将您要 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 方法。所以使用表单更安全。

    【讨论】:

    • 请原谅我的无知,我只是一个初学者,使用表格是什么意思?我很困惑,因为我正在使用表格(我认为),我没有正确使用它们吗?我尝试了将表单嵌入到 index.html.erb 中的“搜索表单”方法,但它没有帮助,或者我无法使其工作
    • 我在您的开场帖中没有看到任何表格。我所说的表单是指 HTML 的表单元素。您当前正在使用仅生成 HTML 的常规链接元素的 link_to 方法。要在 Rails 中生成 HTML 表单元素,您可以使用 form_tag 方法或类似方法。
    • 现在我发现 Rails 路由正在尝试路由到 params[:id] 等于 'reporte_asist' 的 'show' 操作,当然失败了...我尝试修改 config/routes.rb 文件没有成功
    猜你喜欢
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多