Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

外部キーが保存できません

解決したいこと

プログラミング初学者です。
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が無いのでパラメーターに含まれないのかな?と思いました。
分かる方がいればご教授の程よろしくお願いします!!

0

1Answer

create した study_record の id を設定できてないことが原因な気がします。

app/models/tweet_category.rb

  # ツイートを保存
-  Tweet.create(text: text, user_id: user_id, category_id: category_id, study_record_id: study_record_id)
+  Tweet.create(text: text, user_id: user_id, category_id: category_id, study_record_id: study_record.id)

0Like

Your answer might help someone💌