fluid_27’s blog

勉強した内容をアウトプットするためのブログ

ブログアプリ作成⑥ fontawesomeの利用&タグの実装

超絶駆け出しエンジニアの備忘録

 

超初心者がスクールの教材やネット検索を駆使して、不格好なブログアプリを作成する道のり その6

 

 

fontawesomeの利用 

fontawesomeをCDNから利用します。

app/assets/stylesheets/application.scsstに

@import "scaffolds";

@import "posts";

@import url("https://use.fontawesome.com/releases/v5.8.2/css/all.css");

を記述

 

タグの実装

アップしたブログにタグ付けできるようにします。

rails g scaffold tag name:string user:referenceコマンドを実行します。

マイグレーションを確認してみます。

db/migrate/作った日付_create_tags.rbをみると

class CreateTags < ActiveRecord::Migration[6.0]
 def change
  create_table :tags do |t|
   t.string :name
   t.references :user, null: false, foreign_key: true

   t.timestamps
  end
 end
end

となっています。

このままでもいいのですが、上記のままだとタグ付けしないとfalse扱いになってしまうので、

null: false,

だけ削除します。

そして

rails db:migrate

コマンドでマイグレートします。


postモデルとtagモデルの多対多の関係性を記載する

app/models/post.rb に

has_many :post_tags

has_many :tags, through: :post_tags

accepts_nested_attributes_for :post_tags

を追記。

一個ずつ紐解いていくと

has_many :post_tags で

post と post_tagsの関係性を記述

 

has_many :tags, through: :post_tags で

post と tagsの関係性を記述。

ここはデータの「多対多」の中間テーブル(post_tags)を介しているからですね。

詳しくは以下サイトで中間テーブル説明されています。

やさしい図解で学ぶ 中間テーブル 多対多 概念編 - Qiita

 

accepts_nested_attributes_for :post_tags で

親モデルの更新時、子モデルもまとめて更新されるようになります。

 

続いて、tagモデルを編集します。

app/models/tag.rb に

belongs_to :user

has_many :post_tags, dependent: :destroy
has_many :posts, through: :post_tags

validates :name, presence :true

validates :name, uniqueness :ture

を追記します。

これも一つずつ紐解いて行きます。

has_many :post_tags でtagとpost_tagsの一対多の関係を記述

dependent: :destroy でオブジェクトが消去される際、関連するオブジェクトも一緒に消去されるので、Tagが消去された時にTagと同じtag_idをもつPost Tagを消去することになります。

詳細は以下に記述があります。

Active Record の関連付け - Railsガイド

 

has_many :posts, through: :post_tags でpost_tagsを通してpostとは多対多の関係を記述します。

 

validates :name, presences :true

validates :name, uniqueness :true

でカラのタグができないように。

同じ名前のタグがいくつもできないようにしました。

 

post_tagモデルの編集

app/models/post_tag.rb を

class PostTag < Application

   belongs_to :post

   belongs_to :tag

 

   validates :post_id, :uniqueness => { :scope => :tag_id }

end

 と記述します。

 

validates :post_id, uniqueness => { :scope => :tag_id } で

一つのpostに対して同じtagが複数つかないように。

 

また、超絶駆け出しエンジニアなので、突っ込みどころがあればご指導・ご鞭撻いただけると幸いです。