カテゴリーを付けて投稿する
投稿サイトなどを作っていると
・同じカテゴリーの投稿をまとめて表示させたい
・カテゴリーで検索できるようにしたい
と思うことがあると思います、そのためには投稿にカテゴリーを紐付ける必要があります。
今回はそれを書いていきます
1.gemをインストールしよう
今回は用意するカテゴリーが少なく、さらに書き換えることがほとんどないという時の方法です
gem 'active_hash'
こちらのgemを使っていきます
このgemを使えばデータベースに保存するほどの量でもないし、変更する予定もない場合に便利です
追加できたらbundle install
しておきましょう
2.モデルに追記
インストールできたら紐付けたいモデルに追記しましょう
class Tweet < ApplicationRecord
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to_active_hash :category
validates :category_id, presence: true
end
この三行を追記しましょう。
一番上のextendはactive_hashを使用するのに必要です
二番目はカテゴリーと紐付けたいモデルとのアソシエーションです
三番目はバリデーションなので必要な場合は記載しましょう
3.モデルを作成する
次にモデルを作成していきます
ここで注意して欲しいのがrails g models
のコマンドで作成せずにmodelsフォルダに直接追加してあげます。
理由はマイグレーションファイルなど余計なものまで作られてしまい消す手間などが増えるからです。
そして作成できたら下記のように記載していきます
class Category < ActiveHash::Base
self.data = [
{id: 1, name: '風景'}, {id: 2, name: 'ポートレート'}, {id: 3, name: 'スナップ'},
{id: 4, name: 'ペット・生物'}, {id: 5, name: '花・植物'}, {id: 6, name: '自然'},
{id: 7, name: '鉄道'}, {id: 8, name: '車・バイク'}, {id: 9, name: '食事・料理'},
{id: 10, name: '水中写真'}, {id: 11, name: '趣味'}, {id: 12, name: 'フィギュア'},
{id: 13, name: 'モノクローム'}, {id: 14, name: '旅行'}, {id: 15, name: 'ファッション'},
{id: 16, name: 'スポーツ'}, {id: 17, name: 'スチルライフ'}, {id: 18, name: '都市風景'},
{id: 19, name: 'その他'}
]
end
classの継承はそのまま使っても問題ありません。
今回はCategory < ActiveHash::Baseになっていますが、category.rb
なのでそう記載しているだけで作ったモデル名で変えてください。
4.その他諸々
あとは紐付けたいモデルのマイグレーションファイルにcategory_id
を追記してあげます。
さらに入力フォームも作ってあげて、params
の記載を変えてあげればうまくいくと思います。
= form_with(model: @tweet, local: true) do |f|
%h3
投稿する
= render 'shared/error_messages', model: f.object
= f.text_field :title, placeholder: "タイトル"
= f.collection_select :category_id, Category.all, :id, :name, { prompt: "選択してください" }
今回はhamlで書いていますが、このようにすればフォームができるはずです
まとめ
便利なので一度使ってみるのもいいと思います!