Отсутствует ошибка шаблона в Rails при экспорте файлов XLS

export_excel/app/controllers/products/products_controller.rb

class ProductsController < ApplicationController
  def index
    @products = Product.order(:name)
    respond_to do |format|
      format.html
      format.csv { send_data @products.to_csv }
      format.xls
    end
  end
end

export_excel/app/models/product.rb

require 'csv'
class Product < ActiveRecord::Base
  def self.to_csv(options = {})
    CSV.generate(options) do |csv|
      csv << column_names
      all.each do |product|
        csv << product.attributes.values
      end
    end
  end
end

Индексный файл находится в:export_excel/app/views/products/index.html.erb

Частичное в:export_excel/app/views/products/_product.html.erb

Цель состоит в том, чтобы иметь возможность щелкнуть ссылку и начать загрузку файла Excel или CSV, который содержит объекты базы данных в таблице.

Когда я запускал этот код в первый раз, он работал, и у меня все еще есть загруженный файл в моей системе. Однако каждый раз после этого я получал эту ошибку:

Missing template products/index, application/index with {:locale=>[:en], :formats=>[:xls], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in: * "/Users/Candied_Island/Desktop/CPF/export_excel_tutorial/app/views"

My index.hrml.erb is in the correct place, and I believe my partial is in the correct location as well. Please help if you can, I'm not seeing why I'm getting this error.

Кроме того, если это помогает, это говорит, что моя ошибка происходит здесь:

`app / controllers / products_controller.rb: 4: in 'index'

который этот блок кода

respond_to do |format|
  format.html
  format.csv { send_data @products.to_csv }
  format.xls
end

Спасибо!

2 ответа

Решение

Вы должны иметь файл с .xls.erb файл для обработки запроса xls форматы. Как ваше действие файл должен быть index.xls.erb,

Здесь я добавляю пример контента для вас согласно RailsCast#362

    <?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="Sheet1">
        <Table>
          <Row>
            <Cell><Data ss:Type="String">ID</Data></Cell>
            <Cell><Data ss:Type="String">Name</Data></Cell>
            <Cell><Data ss:Type="String">Release Date</Data></Cell>
            <Cell><Data ss:Type="String">Price</Data></Cell>
          </Row>
          <% @products.each do |product| %>
              <Row>
                <Cell><Data ss:Type="Number"><%= product.id %></Data></Cell>
                <Cell><Data ss:Type="String"><%= product.name %></Data></Cell>
                <Cell><Data ss:Type="String"><%= product.released_on %></Data></Cell>
                <Cell><Data ss:Type="Number"><%= product.price %></Data></Cell>
              </Row>
          <% end %>
        </Table>
      </Worksheet>
    </Workbook>

Rails ищет вид, а не находит его. В частности, он ищет представление в формате XLS, которое он может отобразить, потому что вы не указали никаких специальных действий для xls формат, как у вас есть для csv,

Вам нужно иметь index.xls[.erb] смотреть под app/views/products,

Ваша альтернатива состоит в том, чтобы сделать с XLS, как вы сделали для CSV:

class Product < ActiveRecord::Base
  def self.to_xls
    # get xls format data somehow and return it
  end
end
class ProductsController < ApplicationController
  def index
    @products = Product.order(:name)
    respond_to do |format|
      format.html
      format.csv { send_data @products.to_csv }
      format.xls { send_data @products.to_xls }
    end
  end
end
Другие вопросы по тегам