目的
ユーザーの新規登録時に、直接入力させずにテーブルに初期値を保存させること。
使用する技術
- gem devise
実践
以下のテーブルが作成してあるとします。
Column | Type | Options |
---|---|---|
username | string | null: false, unique: true |
string | null: false, unique: true | |
password | string | null: false |
coin | integer | null: false |
今回は、ユーザー登録フォームで
- username
- password
の3項目をのみを入力させます。
ここで、coinカラムは入力させずに、初期値0としてテーブルに保存します。
事前準備
すでに、gem deviseが導入され、コントローラとビューの作成が終了しているものとします。
(このような画面まで用意されている所からです)
deviseのカスタマイズ
ここからは、デバイスのカスタマイズを行っていきます。
初めにdeviseのコントローラを作成して編集できるようにします。
$ rails g devise:controllers users
app/controller/users/
のフォルダにコントローラが作成されました。
このフォルダ内のregistrations_controller.rb
を使用していきます。
次に、ルーティングを一度確認しておきます。
$ rails routes
# 結果
Prefix Verb URI Pattern Controller#Action
new_user_registration GET /users/sign_up(.:format) devise/registrations#new
今のままでは、作成したregistrations_controller.rb
が呼び出されていない状態なので、これを呼び出す記述をします。
Rails.application.routes.draw do
devise_for :users, controllers: {
registrations: 'users/registrations',
}
end
devise導入時に自動的に記述されたdevise_for :users
に続けて、このように記述します。
編集後、もう一度ルーティングを確認します。
$ rails routes
# 結果
Prefix Verb URI Pattern Controller#Action
new_user_registration GET /users/sign_up(.:format) users/registrations#new
devise/registrations#new → users/registrations#new
に変わっていればOKです。
コントローラに初期値を設定
コントローラにnewメソッドとcreateメソッドを定義していきます。
class Users::RegistrationsController < Devise::RegistrationsController
# 省略
def new
@user = User.new
end
def create
@user = User.new(sign_up_params)
unless @user.valid?
flash.now[:alert] = @user.errors.full_messages
render "devise/registrations/new" and return
end
@user[:coin] = 0
@user.save
sign_in(:user, @user)
redirect_to root_path
end
# 省略
registrations_controller.rb
はコメントアウトで記述がされていて、Devise::RegistrationsController
で最初からメソッドが定義されています。
カスタマイズするときは、コメントアウト部分を消してオーバーライド(上書き)していきます。
重要なのは、ここです。
@user[:coin] = 0
@user = User.new
の時点ではcoin: nil
だったところに、0を代入します。
これで、coinカラムに0が入りました。あとはそのまま、データベースにレコードを登録 + ログイン + root_pathにリダイレクトを行っています。
ちなみに補足しておくと、、
unless @user.valid?
flash.now[:alert] = @user.errors.full_messages
render "devise/registrations/new" and return
end
ここは、バリデーションに引っ掛かったときにエラーメッセージを表示させて、登録フォームのページを返すということをしています。(これがない場合、登録されずにTOPページに遷移したりします)
最後に
ユーザーの新規登録の場合はdeviseをカスタマイズする必要がありましたが、
普通のテーブルであれば、new,createメソッドのどちらかに初期値を代入するだけで簡単に保存させられます。