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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

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

Q&A

解決済

1回答

8667閲覧

【Rails】中間テーブルに値を保存したい、更新したい

CodeRascal

総合スコア8

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

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

0グッド

1クリップ

投稿2020/03/06 09:33

編集2020/03/07 02:13

初めまして、現在Railsで質問サイトのようなものを作成しています。
1つの投稿にカテゴリが選択できるようにしたいです。

##開発環境

  • Rails 5.2.4.1
  • ruby 2.5.3p105
  • mysql5.7

##実装したいER図

Postsテーブル

idtitlecontent
1テストタイトルテスト
2テストタイトル2テスト2
3テストタイトル3テスト3

Post_Categoriesテーブル

idpost_idcategory_id
111
221
332

Categoriesテーブル

idcategory_name
1カテゴリ1
2カテゴリ2

つまりid1の記事(Post)とid2の記事(Post)はカテゴリ1、id3の記事(Post)はカテゴリ2に属するというような感じです。

##実装したもの

###【Postsコントローラー】

ruby

1class PostsController < ApplicationController 2 3 def index 4 @posts = Post.all 5 end 6 7 def new 8 @post = Post.new 9 end 10 11 def create 12 category = Category.find(post_params[:unit_id]) 13 post = category.posts.create( 14 title: post_params[:title], 15 content: post_params[:content], 16 user_id: current_user.id 17 ) 18 end 19 20 def destroy 21 post = Post.find(params[:id]) 22 if post.user_id == current_user.id 23 post.destroy 24 end 25 end 26 27 def edit 28 @post = Post.find(params[:id]) 29 end 30 31 def update 32 post = Post.find(params[:id]) 33 post.update( 34 title: post_params[:title], 35 content: post_params[:content], 36 user_id: current_user.id 37 ) 38     category = post.categories.update(post_params[:category_id]) 39 end 40 41 private 42 def post_params 43 params.require(:post).permit(:title, :content, :category_id) 44 end 45end 46

【postモデル】

ruby

1class Post < ApplicationRecord 2 has_many :post_categories, dependent: :destroy 3 has_many :categories, through: :post_categories 4 accepts_nested_attributes_for :post_categories, allow_destroy: true 5end 6

【categoryモデル】

ruby

1class Category < ApplicationRecord 2 has_many :post_categories 3 has_many :posts, through: :post_categories 4end 5 6

【post_categoryモデル】

ruby

1class PostCategory < ApplicationRecord 2 belongs_to :post, optional: true 3 belongs_to :category, optional: true 4end 5

##質問詳細

質問の内容は2点です。
どうぞお知恵をお貸しいただければ、幸いです。

###中間テーブルの値の更新ができない

カテゴリを紐づけた記事を編集する際に、カテゴリを変更してもエラーになってしまいます。

実際に私が作成したコードの意図としては、

【createアクション】 カテゴリーに紐づくポストを作成 ↓ 保存

の流れでしたので、

【updateアクション】 呼び出されたポスト ↓ そのポストの内容を更新 ↓ 更新されたポストのカテゴリを、更新画面で選択されたカテゴリに変更 ↓ 保存

のような流れでいいのかなと思い、実装しました。

出現するエラーは次のとおりです。
(注釈:unitをcategoryと読み替えてください><)
イメージ説明

そのほか色々検証しましたが、やはり中間テーブルの値を更新することができません。
Railsのお作法に関して、まだ無知なところもございますので優しく教えてくださると嬉しいです。

###記事投稿の仕方でより良い方法はないか。

現時点の状況として、カテゴリを紐付けた状態で記事を投稿することはできました。

ですが、コントローラーを見て分かるとおり、"カテゴリありきの記事投稿"みたいな感じになっています。
例えば、カテゴリ未選択の状態で記事を投稿するとエラー(ActiveRecord::RecordNotFound in PostsController#create)になってしまいます。

カテゴリに『未選択』を作成して、特にカテゴリ選択が行われなければ『未選択』を選択した状態で投稿、でもいいと思うのですが、何せ中間テーブルを扱うこと自体初めてなので、考え方があっているか不安です。

「それやべえぞ」「別に問題ないと思う」など、ご意見を優しくいただけたら幸いです!

###備考
かれこれ1週間向き合っていますが、肌感的に「Railsのバージョンが4か5かで、書き方が違う・・・?」と思っています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

この辺りの基本的な所は「Railsのバージョンが4か5かで、書き方が違う・・・?」ということはないです。

多対多の関係をつけるのは、中間et−ブルを直接触ることは無しにやれます。
総入れ替え
post.categories = category
post.categories = arry_of_categorys
追加
post.categories << category
post.categories << arry_of_categories
削除
post.categories.delete(category)

投稿2020/03/07 00:42

winterboum

総合スコア23329

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

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

CodeRascal

2020/03/07 02:26

できましたああああ! 本当にありがとうございます、感謝しかありません!!! 総入れ替えの部分も、実に納得のいく書き方でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問