LoginSignup
1
2

More than 3 years have passed since last update.

投稿にカテゴリーを付けよう

Posted at

カテゴリーを付けて投稿する

投稿サイトなどを作っていると
・同じカテゴリーの投稿をまとめて表示させたい
・カテゴリーで検索できるようにしたい
と思うことがあると思います、そのためには投稿にカテゴリーを紐付ける必要があります。
今回はそれを書いていきます

1.gemをインストールしよう

今回は用意するカテゴリーが少なく、さらに書き換えることがほとんどないという時の方法です

Gemfile.
gem 'active_hash'

こちらのgemを使っていきます
このgemを使えばデータベースに保存するほどの量でもないし、変更する予定もない場合に便利です
追加できたらbundle installしておきましょう

2.モデルに追記

インストールできたら紐付けたいモデルに追記しましょう

tweet.rb
class Tweet < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions

  belongs_to_active_hash :category

  validates :category_id, presence: true
end

この三行を追記しましょう。
一番上のextendactive_hashを使用するのに必要です
二番目はカテゴリーと紐付けたいモデルとのアソシエーションです
三番目はバリデーションなので必要な場合は記載しましょう

3.モデルを作成する

次にモデルを作成していきます
ここで注意して欲しいのがrails g modelsのコマンドで作成せずにmodelsフォルダに直接追加してあげます。
理由はマイグレーションファイルなど余計なものまで作られてしまい消す手間などが増えるからです。
そして作成できたら下記のように記載していきます

category.rb
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の記載を変えてあげればうまくいくと思います。

new.html.haml
    = 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で書いていますが、このようにすればフォームができるはずです

まとめ

便利なので一度使ってみるのもいいと思います!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2