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

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

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

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

Ruby on Rails 6

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

Q&A

1回答

580閲覧

Rails CSV出力 関連テーブルのカラムが出力できない

yoohe0722

総合スコア4

CSV

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/08/01 19:18

前提・実現したいこと

Railsで、Userが回答した内容(Answer)をcsvで出力する機能を実装しています。
user一覧からcsvの出力をしたいため、それぞれのユーザーの関連レコードのカラムの値をCSVに出力したいと考えています。
Userモデルと、Answerモデルのアソシエーションを組んだのですが、answerテーブルのカラムを紐付けることができません。

あわせて、users/index.html.erbのviewで、
@userのeach文の中でanswerテーブルのカラムを表示しようとしてもno method errorになってしまいます。

  • userとanswerは1対1の関係です。
  • userテーブルのカラムのみであれば問題なくcsv出力ができているので、csv出力に関する記述は問題ないかと思います。

発生している問題・エラーメッセージ

csv出力ボタンを押したあと

NoMethodError in Users#index Showing app/views/users/index.csv.ruby where line #21 raised: undefined method `answers' for #<User:0x00007f9ddc1dd0e0> Did you mean? answer answer= Extracted source (around line #21): 19 user.city, 20 user.login_id, 21 user.answers.answer_1_1 22 # @answer.answer_1_1 23 # answer_attributes["answer_1_1"] = user.answer.answer_1_1

users/index.html.erb

NoMethodError in Users#index Showing app/views/users/index.html.erb where line #10 raised: undefined method `status' for

該当のソースコード

user.rb

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 has_one :answer 7end

answer.rb

ruby

1class Answer < ApplicationRecord 2 belongs_to :user 3end

users_controller.rb

ruby

1def index 2 @users = User.includes(:answer).page(params[:page]).per(100) 3 @csv_users = User.includes(:answer) 4 respond_to do |format| 5 format.html do 6 end 7 format.csv do 8 filename = 'users_answer_' + DateTime.now.strftime('%Y%m%d%H%M%S') + '.csv' 9 send_data render_to_string, filename: filename, type: :csv 10 end 11 end 12 end

** index.csv.ruby **

ruby

1require 'csv' 2 3CSV.generate do |csv| 4 # column_names = %w(username city login_id) 5 column_names = [ 6 "username", 7 "city", 8 "login_id", 9 "answer1_1" 10 ] 11 12 csv << column_names 13 @csv_users.each do |user| 14 # @answer = user.answer.find(user_id: user.id) 15 column_values = [ 16 user.username, 17 user.city, 18 user.login_id, 19 user.answer.answer_1_1 20 # @answer.answer_1_1 21 ] 22 csv << column_values 23 end 24end

users/index.html.erb

ruby

1<%= link_to "CSV", users_path(format: :csv), class: "btn btn-primary" %> 2<% @users.each do |user| %> 3 <%# <%= render partial: "user", locals: { user: user } %> 4 <div class="row"> 5 <ul> 6 <li><%= user.username %></li> 7 <li><%= user.login_id %></li> 8 <li><%= user.city %></li> 9 <li><%= user.answer.status %></li> 10 </ul> 11 </div> 12<% end %> 13<%= paginate(@users) %> 14

試したこと

  • アソシエーションの記述確認
  • index.csv.rubyのコメントアウト部分のようにアソシエーションを使わず、idで直接紐付けるやり方

参考にした記事

railsでCSV出力をする方法+実務あるある(関連テーブルのカラム出力など)
Rails

【簡単3ステップ】RailsでCSV出力する方法

補足情報(FW/ツールのバージョンなど)

ruby '2.7.1'
rails , '> 6.0.3', '>= 6.0.3.2'
mysql2 , '
> 0.5.3'

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

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

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

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

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

guest

回答1

0

載せてあるプログラムのcodeと冒頭にあるエラーとが辻褄が合いません。
エラーメッセージでは
undefined method `answers' for #User:0x00007f9ddc1dd0e0
とあり、そこに引用されているcodeも
21 user.answers.answer_1_1
と answers です
ですがプログラムではanswersは見当たりません。
エラーが起きた時のcodeを載せてください。

もしくは
載っているcodeでのエラーを載せてください

投稿2020/08/02 02:44

winterboum

総合スコア23567

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問