前提・実現したいこと
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
補足情報(FW/ツールのバージョンなど)
ruby '2.7.1'
rails , '> 6.0.3', '>= 6.0.3.2'> 0.5.3'
mysql2 , '
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。