Как использовать метод send_data в Rails для всего моего представления индекса, а не только для первой страницы? - PullRequest
0 голосов
/ 28 ноября 2018

Я хотел бы иметь возможность загружать данные моего индекса из таблицы заказов в формате csv.Мне удалось реализовать эту функцию с помощью следующего кода:

orders controller:

class OrdersController < ApplicationController
    before_action :find_order, only: [:edit, :destroy, :update, :show]

    def index
        @orders = Order.all.order("created_at DESC").paginate(:page => params[:page], :per_page => 20)
        # to allow csv and xls formats to be downloaded
        respond_to do |format|
            format.html 
            format.csv { send_data @orders.to_csv }
            format.xls { send_data @orders.to_csv(col_sep: "\t") } # tab separate to work with Excel
        end
    end

Модель заказа:

def self.to_csv(options = {}) 
        CSV.generate(options) do |csv|
            csv << column_names
            all.each do |order|
                csv << order.attributes.values_at(*column_names)
            end
        end
    end

Однако, это позволяет мне загружать только первые 20 записей в таблице заказов.из-за нумерации страниц у меня.Я думал, что следующий код исправит это, но это ничего не изменит:

def index
        @orders = Order.all
        # to allow csv and xls formats to be downloaded
        respond_to do |format|
            format.html { @orders.order("created_at DESC").paginate(:page => params[:page], :per_page => 20) }
            format.csv { send_data @orders.to_csv }
            format.xls { send_data @orders.to_csv(col_sep: "\t") } # tab separate to work with Excel
        end
    end

app/views/orders/index.html.erb:43:in `_app_views_orders_index_html_erb___1955221700531553779_70231785858000'
Started GET "/" for 127.0.0.1 at 2018-11-28 01:19:56 +0100
Processing by OrdersController#index as HTML
  Rendering orders/index.html.erb within layouts/application
  User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 3], ["LIMIT", 1]]
  Order Load (0.9ms)  SELECT  "orders".* FROM "orders" ORDER BY created_at DESC LIMIT ? OFFSET ?  [["LIMIT", 10], ["OFFSET", 0]]
   (0.3ms)  SELECT COUNT(*) FROM "orders"
  Rendered orders/index.html.erb within layouts/application (44.6ms)
Completed 200 OK in 216ms (Views: 203.2ms | ActiveRecord: 6.4ms)


Started GET "/orders.csv" for 127.0.0.1 at 2018-11-28 01:20:03 +0100
Processing by OrdersController#index as CSV
  Order Load (0.6ms)  SELECT  "orders".* FROM "orders" ORDER BY created_at DESC LIMIT ? OFFSET ?  [["LIMIT", 10], ["OFFSET", 0]]
  Rendering text template
  Rendered text template (0.0ms)
Sent data  (4.7ms)
Completed 200 OK in 15ms (Views: 4.5ms | ActiveRecord: 0.6ms)

Есть идеи, как сохранить нумерацию страниц, но иметь возможность загружать все записи в таблице Order?

1 Ответ

0 голосов
/ 28 ноября 2018

Я думаю, что это может быть так же просто, как переместить вызов .paginate в format.html { ... } блок

class OrdersController < ApplicationController
    before_action :find_order, only: [:edit, :destroy, :update, :show]

    def index
        orders = Order.all.order("created_at DESC")

        # to allow csv and xls formats to be downloaded
        respond_to do |format|
            format.html do 
                @orders = orders.paginate(:page => params[:page], :per_page => 20)
            end
            format.csv { send_data orders.to_csv }
            format.xls { send_data orders.to_csv(col_sep: "\t") } # tab separate to work with Excel
        end
    end

    ...
end

Вы МОЖЕТ добавить render :index в форматБлок .html.В настоящее время я не смог протестировать этот код.

...