初めまして、現在Railsで質問サイトのようなものを作成しています。
1つの投稿にカテゴリが選択できるようにしたいです。
##開発環境
- Rails 5.2.4.1
- ruby 2.5.3p105
- mysql5.7
##実装したいER図
Postsテーブル
id | title | content |
---|---|---|
1 | テストタイトル | テスト |
2 | テストタイトル2 | テスト2 |
3 | テストタイトル3 | テスト3 |
Post_Categoriesテーブル
id | post_id | category_id |
---|---|---|
1 | 1 | 1 |
2 | 2 | 1 |
3 | 3 | 2 |
Categoriesテーブル
id | category_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かで、書き方が違う・・・?」と思っています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/07 02:26