LoginSignup
2
1

More than 5 years have passed since last update.

ActiveAdmin 出力されるCSVをShift_JISにする

Last updated at Posted at 2015-07-29

どうしても、CSVをShift_JISにしてくれ!!
という熱い要望に答えるために、色々頑張った末辿り着いた方法です。

encodeのオプションを渡せる作りにはなっているっぽいのですが
実際オプションを渡しても実際出てくるファイルはUTF-8でした。

試した方法たち

  1. オプション渡してみる
ActiveAdmin.register RfmReport do
  csv encoding: 'Shift_JIS' do
    column :id
    column :name
  end
end
  1. 設定ファイルに書いてみる
config/initializers/active_admin.rb
# == CSV options
#
# Set the CSV builder separator
# config.csv_options = { :col_sep => ';' }
#
# Force the use of quotes
# config.csv_options = { :force_quotes => true }
config.csv_options = { encoding: 'Shift_JIS' }

うーんおかしいなぁ・・・githubに上がってるコード読んで・・・あ!
作業しているprojectに入っているActiveAdminのcsv_builder.rbを確認してみると
0.6?!! なんか古くね?!!!
でも、これ最新に上げて動作確認してる暇ないよぉ(´・ω・`)
というわけで、一旦付け焼き刃的方法で対処することに。

で、結局・・・

色々調べてみると、CSV出力部分を自作して既存のCSV出力リンクと置き換えるという手法が多かったのですが
それだと各レポート毎に追加しなくてはならないので面倒くさい。

なので、CSV出力させるところを強制的にShift_JISにするようにしてしまいました。

activeadminapp/views/active_admin/resource/index.csv.erb
自分のproject配下にコピーし、csv_outputの文字コードをShift_JISに変更するようにしました。

app/views/active_admin/resource/index.csv.erb
<%-
  csv_lib = if RUBY_VERSION =~ /^1.8/
              require 'fastercsv'
              FasterCSV
            else
              require 'csv'
              CSV
            end

  default = active_admin_application.csv_options
  options = default.merge active_admin_config.csv_builder.options
  columns = active_admin_config.csv_builder.columns

  csv_output = csv_lib.generate(options) do |csv|
    csv << columns.map(&:name)
    collection.each do |resource|
      csv << columns.map do |column|
        call_method_or_proc_on resource, column.data
      end
    end
  end
  csv_output.encode!(Encoding::SJIS, :invalid => :replace, :undef => :replace) #ここで強制的に書き換え
%>
<%= csv_output.html_safe %>

ああ、切ない。。。
今日はActiveAdminを最新にあげて、動作の確認から始めましょう。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1