外部キーが保存できません
解決したいこと
プログラミング初学者です。
railsを使いアプリ開発を行っています。
タスクを登録し、ツイートする事で学習時間を記録するアプリを作っています。
ツイートを投稿した時に複数のテーブルに保存できるようにformオブジェクト使っています。
ツイートを表示する際にそれに紐づくstudy_record(学習時間)をビューに表示させたいのですが、
その際にtweetsテーブルに外部キーのstudy_record_idを保存させたいのですが上手く保存されません。
特にエラー文は出ないのですが、tweetsテーブルの保存ができません(その他のテーブルには問題無く保存されています。)
どこか書き方に問題があるのか、そもそもやり方が違うのかご教授頂けると幸いです。
分かりにくいと思いますので、アプリの挙動とER図を載せておきます
ER図 タスクはcategoryテーブルのtaskカラムです
https://gyazo.com/a1dffd0f848c9c33171928acdae09738
タスクの追加挙動
https://gyazo.com/47e72f359eefa241f12a0a63d0704d57
ツイートの投稿 (保存されない)
https://gyazo.com/7a925c9f4be11773b6a0ceb726d52248
発生している問題・エラー
tweetsテーブルにデータが保存されない
該当するソースコード
app/controllers/tweets_controller.rb
def new
@tweet_category = TweetCategory.new
@categories = current_user.categories.all
end
def create
# binding.pry
@tweet_category = TweetCategory.new(tweet_category_params)
if @tweet_category.save
redirect_to controller: :tweets, action: :index
else
render action: :new
end
end
def move_to_sign_in
unless user_signed_in?
redirect_to "/users/sign_in"
end
end
private
def tweet_category_params
params.require(:tweet_category).permit(:text, :hour_time, :category_id, :study_record_id).merge(user_id: current_user.id)
end
formオブジェクトで処理をまとめています
app/models/tweet_category.rb
class TweetCategory
include ActiveModel::Model
attr_accessor :hour_time, :text, :category_id, :user_id, :study_record_id
def save
# 学習記録を保存
study_record = StudyRecord.create(hour_time: hour_time, category_id: category_id)
# ツイートを保存
Tweet.create(text: text, user_id: user_id, category_id: category_id, study_record_id: study_record_id)
end
end
ツイート送信フォーム
app/views/tweets/new.html.erb
<%= render "tweets/sub_header" %>
<div class="all-contents">
<div class="sign-left-bar">
</div>
<div class="contents-row">
<div class="container">
<%= form_with(model: @tweet_category, url: tweets_path, local: true) do |form| %>
<h3>投稿する</h3>
<%= form.collection_select(:category_id, @categories, :id, :task, {prompt: "タスクを選択して下さい"}, {} ) %>
<%= form.text_area :hour_time, placeholder: "小数点第一位まで可!", class: "time_area" %>
<%= form.text_area :text, placeholder: "text", rows: "10" %>
<%= form.submit "ツイート" %>
<% end %>
</div>
</div>
<div class="sign-right-bar">
</div>
</div>
app/models/study_record.rb
class StudyRecord < ApplicationRecord
belongs_to :category
has_many :tweets
end
app/models/tweet.rb
class Tweet < ApplicationRecord
belongs_to :user
belongs_to :category, -> { with_deleted }
belongs_to :study_record
end
自分で試したこと
外部キーのstudy_recordをテーブルから外すと問題無くツイートを保存する事ができるのでstudy_record_idの処理に問題があると思います。
原因は分からないですが、予想だとツイートを保存する際に該当するstudy_record_idが無いのでパラメーターに含まれないのかな?と思いました。
分かる方がいればご教授の程よろしくお願いします!!