user
モデルを作った
そして user
モデルに has_one
の user_introduction
モデルを作った
自分的には user
に user_introduction
をネストさせておいて
作成時にビルドさせる形にしたい。
しかし devise
をつかっているのでどうしようとなった
開発環境
ruby 2.6.5
Ruby on Rails 5.2.5
このへん参考させていただいた。
どうするのかというと
① user
と user_introduction
をネスト
②自分の環境に devise
のコントローラーをインストール
③ユーザーの新規作成時だけ自分のコントローラーを通るようにルーティング
④ create
アクションのあとに作成したユーザーに user_introduction
をビルド
という流れ
以下具体的なフロー
①
has_one :user_introduction, dependent: :destroy
accepts_nested_attributes_for :user_introduction
belongs_to :user
上記のように
user
で user_introduction
をネストする
②
コンソール上で
rails g devise:controller users
をする
devise
本体のコントローラーが自分の環境にインストールされる
その中の
registrations_controller.rb
を
class Users::RegistrationsController < Devise::RegistrationsController
before_action :configure_sign_up_params, only: [:create]
before_action :configure_account_update_params, only: [:update]
def new
super
end
def create
super
end
def edit
super
end
def update
super
end
def destroy
super
end
def cancel
super
end
protected
def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
end
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [:attribute])
end
def after_sign_up_path_for(resource)
super(resource)
end
def after_inactive_sign_up_path_for(resource)
super(resource)
end
end
となるようにコメントアウト
③
ルーティングは
devise_for :users, controllers: {
registrations: 'users/registrations'
}
とする。
こうすることで新規登録のときだけ自分の環境を通るようになる
④
上記のコントローラー内を
def create
super
resource.build_user_introduction
resource.save
end
とする
resource
っていうのに新しく作られるユーザーがはいってるから
それに対して build_user_introduction
してやると
中身は空だけど user_id
が紐付いた user_introduction
が作られる
追記
いろいろやったけどよくよく考えたら user
の create
でコールバックさせればいいらしい
たしかに