Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CSV出力 - Viewからやるか? 他からやるか? / How to output CSV

KSK
October 17, 2018

CSV出力 - Viewからやるか? 他からやるか? / How to output CSV

KSK

October 17, 2018
Tweet

More Decks by KSK

Other Decks in Programming

Transcript

  1. Modelで実装 (app/controllers/company_controller.rb) class CompanyController < ApplicationController def index condition =

    (...) # 検索条件 records = Company.to_csv(condition) respond_to do |format| format.html format.csv do send_data records end end end end (app/models/company.rb) require 'csv' class Company < ApplicationRecord def to_csv(condition) csv = CSV.generate(:force_quotes => true) { |csv| csv << @records.first.keys @records.each do |r| csv << r end } csv.encode('Shift_JIS', undef: :replace) end end (app/controllers/company_controller.rb) class CompanyController < ApplicationController def index condition = (...) # 検索条件 @records = Company.where(condition) respond_to do |format| format.html format.csv do send_data render_to_string end end end end (app/views/company/index.csv.ruby) require 'csv' csv = CSV.generate(:force_quotes => true) { |csv| csv << @records.first.keys @records.each do |r| csv << r end } csv.encode('Shift_JIS', undef: :replace) Viewで実装
  2. Modelで実装 (app/controllers/company_controller.rb) class CompanyController < ApplicationController def index condition =

    (...) # 検索条件 records = Company.where(condition) respond_to do |format| format.html format.csv do send_data records end end end end (app/models/company.rb) require 'csv' class Company < ApplicationRecord def to_csv(condition) csv = CSV.generate(:force_quotes => true) { |csv| csv << @records.first.keys @records.each do |r| csv << r end } csv.encode('Shift_JIS', undef: :replace) end end (app/controllers/company_controller.rb) class CompanyController < ApplicationController def index condition = (...) # 検索条件 @records = Company.where(condition) respond_to do |format| format.html format.csv do send_data render_to_string end end end end (app/views/company/index.csv.ruby) require 'csv' csv = CSV.generate(:force_quotes => true) { |csv| csv << @records.first.keys @records.each do |r| csv << r end } csv.encode('Shift_JIS', undef: :replace) Viewで実装 view 拡張子に .ruby を指定して ruby コードを記述 処理 ロジック自体 同じように書ける
  3. なんでViewか? ・表示 ため 整形処理 ・レコード 整形について View で  いじちゃってる箇所もあった  ・Decorator噛ませたかった

    (LT後補足) 「サービスクラスとかで共通処理書く が良い で 」というご意見いただきました。 割とそ 通りだと思ってます。 ただ今回 、既存 ビジネスロジックが分散してえらいことになっていたこと、Decorator 処理を 噛ませたかったことからこ ような判断をしています。 本来なら根本からリファクタリングする が筋で ありますが、今回面倒な で見送りました一回死んできます そ 辺り 腰を据えて取り組めるタイミングで別途対応する、という判断になりました。