Railsやってて、カテゴリーってどうやって関連付けるんだろう?そう思ったことはないだろうか?
今この記事を見ているのなら、カテゴリーとPostとかShopとかVideoとの関連付けに困っているはず。
なので、Railsでカテゴリーを関連付けする方法を解説します。
どうも!15年ほど現役ITエンジニアをしているよこやま良平です。
その観点からわかりやすく解説します。
目次
1 RailsでScaffoldでベースを作成
まずは元になる、ShopとかPostとかをScaffoldします。
$ rails g scaffold post title:string content:text category_id:integer
$ rails db:migrate
これでベースとなる入力フォームができます。
2 RailsでCategoryを作成する
次はRailsのコマンドで同じくカテゴリーのベースをScaffoldで作成します。
$ rails g scaffold category name:string
$ rails db:migrate
これでカテゴリー入力フィールドが出来ました。
3 PostとCategoryをModelsで関連付ける
こっから困っている部分になってますね?
関連付ける場所は2かしょです。
class Category < ApplicationRecord
has_many :posts
end
class Post< ApplicationRecord
belongs_to :category
end
has_many :posts
belongs_to :category
この2つを使って関連付けを行います。重要な部分です。
4 Railsで関連付けしたカテゴリーを投稿時に選択できるようにする
<div class="field">
<%= form.select :category_id, Category.all.map{|o| [o.name, o.id]} %>
</div>
こう書くことで、Categoryの元々ある番号とPostsで作ったCategory_idを関連付けできます。
関連づけると、数字での選択ではなくCategoryで作成した名前で選択できるようになります。
- メンズ
- インナー
- ジャケット
- パンツ
などの名前で選択できるようになります。
5 Viewsへも追加してRailsで関連付けたカテゴリーを表示できるようにする
<%= post.category.name %>
これをindex.html.erb ファイルに追加する。
こちらは
<% @posts.each do |post| %>
~中略~
この間に入れる
~中略~
<% end %>
続いて
<%= @post.category.name %>
show.html.erb内ならどこに置いても動く。
応用編 制作途中でカテゴリーを追加したくなったら
$ rails g migration AddCategory_idToPosts category_id:integer
$ rails db:migrate
これで追加できるので、次の記述も忘れずに
def post_params
params.require(:post).permit(:title, :content, :category_id )
end
:category_id
この追加した部分を忘れないように追記すること。
これを忘れると、投稿時や編集時にカテゴリーを保存出来なくなる。
番外編 エラー:Category translation missing: ja.activerecord.errors.models.post.attributes.category.required が出たら
Category translation missing: ja.activerecord.errors.models.video.attributes.category.required
こんなエラーが出たら、これはエラー文章がうまく日本語化できてない証拠。
ja:
activerecord:
errors:
models:
video:
attributes:
category:
required: カテゴリー選択必須
このように追加してやると解決する。
人によって
- ja.yml
これが devise.views.ja.yml になっている場合もある
この devise はログイン制御する実装を行うと一番始めに使うGemなので使っていたらわかる。