railsアプリで登録されたユーザー情報をCSVファイルへ出力する機能を実装しようとしています。
csvの出力自体は行えたのですが、実際のファイルをmacのNumbersで開いてみると表題の問題が起こっています。(windowsのExcelも同様)
具体的には、電話番号や郵便番号の頭の「0」が表示されない状態です。(元データはハイフン無しの文字列ですが、開く際に勝手に数値に変換されている??)
テキストエディタ出力ファイルを確認すると、0落ちせず「"08011112222"」のような形で出力されています。
これは、出力する側で制御可能なのでしょうか?
制御可能であれば0落ちを防ぐための対策を教えていただけますと助かります。
【出力方法】
app/models/user.rb
user.rb
1def self.csv_attributes 2 ["name", "tel", "email", "post_code", "prefectures", "address_1", "address_2", "room_number", "created_at", "updated_at"] 3end 4 5def self.generate_csv 6 csv_columns = ["名前", "電話番号", "メールアドレス", "郵便番号", "都道府県", "住所1", "住所2", "住所3", "登録日時", "最終更新日時"] 7 CSV.generate(encoding: Encoding::SJIS, row_sep: "\r\n", force_quotes: true) do |csv| 8 csv << csv_columns 9 all.each do |user| 10 csv << csv_attributes.map{ |attr| user.send(attr) } 11 end 12 end 13end
usersのindexのビューにエクスポートボタンを設置
app/controllers/users_controller.rb
def index @users = User.all respond_to do |format| format.html format.csv { send_data @users.generate_csv, filename: "users-#{Time.zone.now.strftime("%Y%m%d%S")}.csv" } end end
【テーブル情報】
create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "name" t.string "tel" t.string "email" t.string "post_code" t.string "prefectures" t.text "address_1" t.text "address_2" t.string "room_number" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end
##試してみたこと
app/models/user.rb内のself.attributes
内で属性名を取り出すのではなく値を直接取り出して、0落ちしてしまう値に対してこちらで紹介されている0落ち対策を行おうとしましたが、NoMethodErrorとなりました。
app/models/user.rb
def self.csv_attributes [self.name, %Q{="#{self.tel}"}, self.email, %Q{="#{self.post_code}"}, self.prefectures, %Q{="#{self.address_1}"}, %Q{="#{self.address_2}"}, %Q{="#{self.room_number}"}, self.created_at_date, self.updated_at_date, self.orders_counts, self.order_rackets_counts, self.order_amounts] end def self.generate_csv csv_columns = ["名前", "電話番号", "メールアドレス", "郵便番号", "都道府県", "住所1", "住所2", "住所3", "登録日時", "最終更新日時"] CSV.generate(encoding: Encoding::SJIS, row_sep: "\r\n", force_quotes: true) do |csv| csv << csv_columns all.each do |user| # csv << csv_attributes.map{ |attr| user.send(attr) } csv << csv_attributes end end end
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/02 06:58