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

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

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1004閲覧

CSVへの書き込みがうまくいきません

RThe

総合スコア25

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/09/21 07:01

現在、勤務形態のアプリを作成しております。
写真のように、ボタンを押すと、該当職員の勤務形態ががCSVに書き込まれるという内容なのですが、
カラムの取得方法がわからない状況です。

取得したいカラムとしては、「woked_on(出勤日)]「started_at(出勤時間)「finished_at(退勤時間)」で、
モデルはuserとattenndance(勤怠)で、1対多の関係です。
attendance.rbに記載したdef self.to_csv内のvalues = []に該当カラムを入れるのだとは思いますが、
スクショのようなエラーとなってしまいます。(文字列or空にすれば、書き込み自体は可能です)

○実現したい内容→各ユーザーの勤務データをCSVに書き込みたい
○現状→エラーが出てしまう。
○試みた内容→CSV自体の出力はできるので、values = []内の内容をどのように記載するかを考察。
userのattendanceということで,@user.attendance.worked_on,
@user.attendance.started_at,@user.attendance.finished_atとした。

お手数おかけしますが、解決策をご教授頂けると幸いです。
宜しくお願い申し上げます。

*勤務表&CSVボタン画面*

イメージ説明

*成功イメージ*

イメージ説明

*エラー画面*

イメージ説明

*attendance.rb*

rb

1def self.csv_attributes 2 ["worked_on," "started_at", "finished_at"] 3 end 4 5 def self.to_csv 6 headers = %w(日付 出社 退社) 7 csv_data = CSV.generate(headers: headers, write_headers: true, force_quotes: true) do |csv| 8 csv << csv_attributes 9 values = [ 10 @user.attendance.worked_on, 11 @user.attendance.started_at, 12 @user.attendance.finished_at 13 ] 14 all.each do |row| 15 csv << values 16 end 17 end 18 csv_data.encode(Encoding: :SJIS)

*user_controller.rb*

rb

1def show 2 @worked_sum = @attendances.where.not(started_at: nil).count 3 @attendances = Attendance.all 4 respond_to do |format| 5 format.html 6 format.csv { send_data @user.attendances.to_csv, type: 'text/csv; charset=shift_jis', filename: "#{@user.name}#{l(@first_day, format: :middle)}分勤怠.csv" } 7 end 8 end

*user_show.html.erb*

erb

1<%= link_to "CSV出力",user_path(format: 'csv'),class: "btn btn-primary" %>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

undifined method "attendance" for nil:NilClass

は、@userがnilのattendanceはないよ(つまり@userが取得できていない)という意味です。

そのためUser.all each do |@user|などで全員のデータを取得してから、個人のデータを抜き出す形になるかと思います。

投稿2020/09/21 12:07

no1knows

総合スコア3365

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RThe

2020/09/21 14:47

ご回答いただき、ありがとうございます。 先にuserを取得!そうゆうことなんですね。 大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問