※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
プロフィールページを作る
1対1
- ユーザーとプロフィール → 1対1
プロフィールに載せるもの
- ニックネーム(文字)
- 生年月日(日付)
- 性別(数字)
- 自己紹介(長文)
- 通知設定(Boolean)
「true」or「false」の二択から選ぶ
モデルを作る
warp(ターミナル画面)で以下を実行
rails g model Profile
db/マイグレーションファイルを開く
class CreateProfiles < ActiveRecord::Migration[6.0]
def change
create_table :profiles do |t|
# userと紐づける user_idがないとfalseになる
t.references :user, null: false
# 文字列 ニックネーム
t.string :nickname
# 長文 自己紹介
t.text :introduction
# 整数 性別は文字列じゃなくて数字にすることが多い
t.integer :gender
# 日付 生年月日
t.date :birthday
# メールの通知設定 デフォルトはfalseにしておく
t.boolean :subscribed, default: false
t.timestamps
end
end
end
user(user_id)がないと絶対に保存できません
t.references :user, null: false
rails db:migrate
userとprofileを関連付ける
t.references :user
によりデータベース上は紐づいたので、rails上(ActiveRecord)でも関連付けていく
ユーザーはひとり「user(単数形)」、プロフィールもひとつ「profile(単数形)」と書くこと
app/models/user.rbを開く
- 「userはprofileをひとつ持っている(
has_one
)」 - 「userを消したら、profileも削除するよ(
dependent: :destroy
)」
has_many :comments, dependent: :destroy
app/models/profile.rbを開く
「profileはuserに所属(belongs_to
)している」
class Profile < ApplicationRecord
belongs_to :user
end
config/routes.rbを開く
resources
ではなく、resource
を使うresource
の場合、indexが作成されない
→ profileは1つなので、showがあれば良い- さらに、
resource
の場合は:newや:createも使わない
→ :editと:updateのみ使うことが多い
Rails.application.routes.draw do
# 中略
resources :articles do
resources :comments, only: [:new, :create]
end
resource :profile, only: [:show, :edit, :update]
end
app/controllers/profiles_controller.rbを作成する
controllerでは必ず複数形「profiles」で書くこと
before_action :authenticate_user!
authenticate_user → ログインしているユーザー
def show
@profile = current_user.profile
end
user.rbの中でhas_one :profile
と定義しているため、.profile
でプロフィールを取得できる
class User < ApplicationRecord
#中略
has_one :profile, dependent: :destroy
end
app/views/profiles/show.html.hamlを作成する
profiles_controller.rbなので、profilesのフォルダを作る
layouts/application.html.hamlにプロフィールのリンクを貼る
= link_to 'プロフィール', profile_path
= link_to 'Edit', edit_profile_path
profilesではなく、ひとつだけなのでprofile
になる
メソッド | 説明 |
---|---|
resources | 複数ある 例)記事・コメント |
resource | ひとつしかない 例)プロフィール |
#DAY23