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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

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

Q&A

解決済

1回答

1623閲覧

railsでcreateした時にデータベースにidが保存されない

riku0617

総合スコア8

Ruby on Rails 5

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

0グッド

0クリップ

投稿2019/08/16 06:01

前提・実現したいこと

現在、SNSサイトを作っていて行き詰まってしまったので質問しました。
グループがいくつかあって、そのグループに所属しているユーザーがグループに紐づいたトピックを作成することができるようにしたいです。

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

topicのcreateの段階でgroup_idは保存されるのに、topic_idは保存されず、topicのshowページに飛ぶことができないということが起きています。
どなたかご教授お願いします。

該当のソースコード

controller

1class TopicsController < ApplicationController 2 def show 3 @topic = Topic.find(params[:id]) 4 end 5 6 def new 7 group = Group.find(params[:group_id]) 8 @topic = group.topics.new 9 end 10 11 def create 12 group = Group.find(params[:group_id]) 13 topic = topic.groups.build(topic_params) 14 topic.group_id = group.id 15 topic.save 16 redirect_to group_path(group.id) 17 end 18 19 private 20 def topic_params 21 params.require(:topic).permit(:topic_name, :topic_content, :user_id, :group_id, :user_topic_id) 22 end 23 24end 25

model

1class Group < ApplicationRecord 2 has_many :topics, dependent: :destroy 3 has_many :users, through: :group_members 4 has_many :group_members 5 accepts_nested_attributes_for :group_members 6 has_many :user_topics 7 8 # ユーザーがグループに参加してるかどうかのメソッドを定義 9 def joined_by?(user) 10 group_members.where(user_id: user.id).exists? 11 end 12end 13 14class Topic < ApplicationRecord 15 belongs_to :group 16 has_many :user_topics 17 has_many :users, through: :user_topics 18 19 def joined_by?(user) 20 user_topics.where(user_id: user.id).exists? 21 end 22end

db

1 create_table "groups", force: :cascade do |t| 2 t.integer "user_id" 3 t.string "group_name" 4 t.datetime "created_at", null: false 5 t.datetime "updated_at", null: false 6 end 7 8 create_table "topics", force: :cascade do |t| 9 t.integer "user_id" 10 t.integer "group_id" 11 t.string "topic_name" 12 t.string "topic_content" 13 t.datetime "created_at", null: false 14 t.datetime "updated_at", null: false 15 end
route resources :groups do resource :group_members, only: [:create, :destroy] resource :topics, only: [:new, :create, :index] end resources :topics do resource :user_topics, only:[:create, :destroy] end

binding.pryをしてみたところ

14: def create 15: group = Group.find(params[:group_id]) 16: topic = group.topics.build(topic_params) 17: binding.pry => 18: topic.group_id = group.id 19: topic.save 20: redirect_to group_path(group.id) 21: end [1] pry(#<TopicsController>)> topic => #<Topic:0x0000564777fb4bd0 id: nil, user_id: nil, group_id: 2, topic_name: "テスト", topic_content: "テスト", created_at: nil, updated_at: nil> [2] pry(#<TopicsController>)> group => #<Group:0x0000564777d9d3d8 id: 2, user_id: nil, group_name: "PHP", created_at: Sun, 11 Aug 2019 04:28:41 UTC +00:00, updated_at: Sun, 11 Aug 2019 04:28:41 UTC +00:00> [3] pry(#<TopicsController>)>

このようにtopicのidがnillになっています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

class TopicsController  の create の2行目おかしいですね?
binding.pryをしてみたところ の 16行目なら正しい。

で、
18行目ではまだsaveされていないので id はつけられていません。
19行の後で確認してみて下さい

投稿2019/08/16 09:28

winterboum

総合スコア23284

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

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

riku0617

2019/08/16 11:05

御回答ありがとうございます。 教えていただいた通りにして見たところ、topicにしっかりidが保存されていました。 showページに飛べない件もviewのlink_to 〜のところでパスにidが渡せてなかったのが原因でした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問