質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.62%

rails:検索結果をCSV形式でダウンロードしたい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 501

Amkys

score 10

問題点

はじめて質問投稿させて頂きます。

検索結果をCSVでダウンロードし
CSVファイルには、カラムとデータのみを表示させたいが
データがHTML形式?になっている。

いろいろググってみましたが、問題解消できず質問させて頂きました。

今だ解決出来ず、情報として'Download CSV'ボタン押下時のログを記載します。

'Download CSV'ボタン押下時のログ

■Server Console
Started GET "/lot_histories.csv?q%5Bprocessed_lot_num_cont%5D=&q%5Btool_id_cont%5D=1&q%5Bunit_cont%5D=" for [server IP Address] at 2019-03-27 17:09:57 +0900
Processing by LotHistoriesController#index as CSV
Parameters: {"q"=>{"processed_lot_num_cont"=>"", "tool_id_cont"=>"1", "unit_cont"=>""}}
User Load (2.9ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
↳ vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.2/lib/active_record/log_subscriber.rb:98
Rendering lot_histories/index.csv.ruby within layouts/application
LotHistory Load (3.0ms)  SELECT  "lot_histories".* FROM "lot_histories" WHERE "lot_histories"."tool_id" LIKE '%1%' LIMIT ? OFFSET ?  [["LIMIT", 25], ["OFFSET", 0]]
↳ app/views/lot_histories/index.csv.ruby:5
Rendered lot_histories/index.csv.ruby within layouts/application (4.5ms)
rails/develop/sample/app/views/layouts/application.slim:12: warning: string literal in condition
Rendering text template
Rendered text template (0.0ms)
Sent data lot_histories_20190327170958.csv (0.5ms)
Completed 200 OK in 145ms (Views: 0.3ms | ActiveRecord: 5.8ms)

問題のCSVファイル

<!DOCTYPE html><html><head><title>ToolList</title><meta name="csrf-param" content="authenticity_token" />        
<meta name="csrf-token" content="1bc+1H+oKUsXpUoVEs+PDXA4O7rgqpzLqW4sBlmY5NFBg0u4CaDeRK4HkxZu7uelzorRjbeRxXp4AlDzl3XAZw==" /><link rel="stylesheet" media="all" href="/sample/assets/bootstrap_and_overrides.self-507679b6e014ab13ad44cd230748b813f795174034dc48cc9da8d583362027b9.css?body=1" data-turbolinks-track="reload" />        
<link rel="stylesheet" media="all" href="/sample/assets/home.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" />        
<link rel="stylesheet" media="all" href="/sample/assets/lot_histories.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" />        
<link rel="stylesheet" media="all" href="/sample/assets/scaffolds.self-55bbf01fb89a78565db7158345eab27a5894ce497c9d83097a6e4670e02c03e0.css?body=1" data-turbolinks-track="reload" />        
<link rel="stylesheet" media="all" href="/sample/assets/sessions.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" />        
<link rel="stylesheet" media="all" href="/sample/assets/users.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" />        
<link rel="stylesheet" media="all" href="/sample/assets/application.self-f0d704deea029cf000697e2c0181ec173a1b474645466ed843eb5ee7bb215794.css?body=1" data-turbolinks-track="reload" /><script src="/sample/assets/rails-ujs.self-d109d8c5c0194c8ad60b8838b2661c5596b5c955987f7cd4045eb2fb90ca5343.js?body=1" data-turbolinks-track="reload"></script>        
<script src="/sample/assets/activestorage.self-1ed4604ac2170045f1ffca4edb81a75246661555e4f9cf682bb8a21825e32e1c.js?body=1" data-turbolinks-track="reload"></script>        
<script src="/sample/assets/turbolinks.self-569ee74eaa15c1e2019317ff770b8769b1ec033a0f572a485f64c82ddc8f989e.js?body=1" data-turbolinks-track="reload"></script>        
<script src="/sample/assets/bootstrap.self-fdc98dee79ee88255e10cac6caa91338165cb76cf0d263744d8d90011fc2ef8f.js?body=1" data-turbolinks-track="reload"></script>        
<script src="/sample/assets/action_cable.self-69fddfcddf4fdef9828648f9330d6ce108b93b82b0b8d3affffc59a114853451.js?body=1" data-turbolinks-track="reload"></script>        
<script src="/sample/assets/cable.self-8484513823f404ed0c0f039f75243bfdede7af7919dda65f2e66391252443ce9.js?body=1" data-turbolinks-track="reload"></script>        
<script src="/sample/assets/home.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script>        
<script src="/sample/assets/lot_histories.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script>        
<script src="/sample/assets/sessions.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script>        
<script src="/sample/assets/users.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script>        
<script src="/sample/assets/application.self-66347cf0a4cb1f26f76868b4697a9eee457c8c3a6da80c6fdd76ff77e911715e.js?body=1" data-turbolinks-track="reload"></script></head><body>tool_id    unit    processed_lot_num
Tool_001    AAA    1
Tool_001    BBB    555
</body></html>        

求めているCSVファイル

tool_id    unit    processed_lot_num
Tool_001    AAA    1
Tool_001    BBB    555

環境情報

サーバ:Red Hat Enterprise Linux Server release 6.8 (Santiago)
Rails 5.2.2
ruby 2.6.1p33

試したこと

WebブラウザがGoogle Chromeなのが原因かもと思いIEでも試しましたがダメでした。

該当のソースコード

lot_histories_controller.rb(抜粋)

class LotHistoriesController < ApplicationController
  before_action :set_lot_history, only: [:show, :edit, :update, :destroy]

  # GET /lot_histories
  # GET /lot_histories.json
  # GET /lot_histories.csv
  def index
    @q = LotHistory.ransack(params[:q])
    @lot_histories = @q.result.page(params[:page])

    respond_to do |format|
      format.html
      format.csv do
        send_data render_to_string, filename: "lot_histories_#{Time.now.strftime('%Y%m%d%H%M%S')}.csv", type: :csv
      end
    end
  end

index.html.slim

- model_class = LotHistory
.page-header
  h1=t '.title', :default => model_class.model_name.human.pluralize.titleize

= search_form_for @q do |f|
  = f.submit class: 'btn btn-default'
  '
  = link_to 'Clear', url_for, class: 'btn btn-default'
  '
  = page_entries_info(@lot_histories)

  table.table.table-striped
    thead
      tr
        th = sort_link(@q, :tool_id)
        th = sort_link(@q, :unit)
        th = sort_link(@q, :processed_lot_num)
        th = t '.actions', :default => t("helpers.actions")
      tr
        th= f.search_field :tool_id_cont
        th= f.search_field :unit_cont
        th= f.search_field :processed_lot_num_cont
    tbody
      - @lot_histories.each do |lot_history|
        tr
          td= link_to lot_history.tool_id, lot_history_path(lot_history)
          td= lot_history.unit
          td= lot_history.processed_lot_num
          td
            = link_to t('.show', :default => t("helpers.links.show")), lot_history_path(lot_history), :class => 'btn btn-info btn-xs'
            '
            = link_to t('.edit', :default => t("helpers.links.edit")), edit_lot_history_path(lot_history), :class => 'btn btn-warning btn-xs'
            '
            = link_to t('.destroy', :default => t("helpers.links.destroy")), lot_history_path(lot_history), :method => :delete, :data => { :confirm => t('.confirm', :default => t("helpers.links.confirm", :default => 'Are you sure?')) }, :class => 'btn btn-xs btn-danger'
end


= page_entries_info(@lot_histories)
p
= link_to t('.new', :default => t("helpers.links.new")), new_lot_history_path, :class => 'btn btn-primary'
'
= link_to 'Download CSV', lot_histories_path(q: request.params[:q], format: :csv), :class => 'btn btn-default'


index.csv.ruby

require 'csv'

csv_str = CSV.generate do |csv|
  csv << @lot_histories.column_names
    @lot_histories.all.each do |lot_history|
    csv << lot_history.attributes.values_at(*@lot_histories.column_names)
  end
end


lot_history.rb

class LotHistory < ApplicationRecord
  validates :tool_id, presence: true
end
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

試してないのですが、おそらく

rails/develop/sample/app/views/layouts/application.slim

application.html.slimにリネームする事で改善する気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/27 18:08

    早速の回答有難うございます。
    application.html.slim にリネームしたところ
    ヘッドと値だけ出力され、重い通りのCSV出力となりました。

    心よりお礼申し上げます。
    本当にありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる